为什么O_CLOEXEC / FD_CLOEXEC标志不起作用?

时间:2019-04-18 16:11:45

标签: c linux pipe fork fcntl

我有一个父进程,其中有一些子进程,在分叉之前不需要父进程打开的FIFO描述符。我尝试过以下方法

  • fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);打开fd后。
  • fd = open(/tmp/testfifo, O_RDONLY|O_CLOEXEC|O_NONBLOCK);

要查看其是否正常工作,我按照以下步骤进行操作,但是第一个不起作用,因为它被确定为a bug。但是,我不明白第二个错误是什么。

第一种方法,

if (fcntl(fd, F_GETFD) & FD_CLOEXEC) {
    fprintf(stderr, "FD_CLOEXEC is set\n");
}

终端上的第二种方法,

lsof -n | grep /private/tmp/testfifo

它打印了两个孩子,

program   17898 soner    3r     FIFO     0t0 5274098 /private/tmp/testfifo
program   17898 soner    4w     FIFO     0t0 5274098 /private/tmp/testfifo
program   17899 soner    3r     FIFO     0t0 5274098 /private/tmp/testfifo
program   17899 soner    4w     FIFO     0t0 5274098 /private/tmp/testfifo
program   17900 soner    3r     FIFO     0t0 5274098 /private/tmp/testfifo
program   17900 soner    4w     FIFO     0t0 5274098 /private/tmp/testfifo

我的方法错误吗?还是我做错了什么?还是我误解了国旗的原理?

0 个答案:

没有答案