12

open() を使用して O_CLOEXEC フラグを設定しようとしましたが、成功しませんでした。

次のマイクロテストを検討してください。

#include <stdio.h>
#include <fcntl.h>

int main() {
  int fd = open("test.c", O_RDONLY | O_CLOEXEC);
  int ret = fcntl(fd, F_GETFL);
  if(ret & O_CLOEXEC) {
    printf("OK!\n");
  } else {
    printf("FAIL!\n");
  }
  printf("fd = %d\n", fd);
  printf("ret = %x, O_CLOEXEC = %x\n", ret, O_CLOEXEC);
  return 0;
} 

カーネル バージョン 2.6 の Linux で実行すると、テストは成功し、「OK!」と出力されますが、3.8 または 3.9 カーネルでは失敗します。

どうしたの?ありがとう!

4

3 に答える 3

2

それは間違っている。この方法で行う必要があります:

int ret = fcntl(fd, F_GETFD);
if (ret & FD_CLOEXEC) {
...
}
于 2014-09-26T22:33:50.890 に答える
2

fcntl 呼び出しパラメーターF_GETFD、フラグ is FD_CLOEXEC、およびO_CLOEXECサポートは 2.6 で登場しました。23. マニュアルを読む:

 File descriptor flags
   The following commands manipulate the flags associated with a file descriptor.
   Currently,  only one such flag is defined: FD_CLOEXEC, the close-on-exec flag.
   If the FD_CLOEXEC bit is 0, the file descriptor will  remain  open  across  an
   execve(2), otherwise it will be closed.

   F_GETFD (void)
          Read the file descriptor flags; arg is ignored.

   F_SETFD (int)
          Set the file descriptor flags to the value specified by arg.
于 2013-08-19T03:45:57.987 に答える