Почему не работает флаг O_CLOEXEC / FD_CLOEXEC? - PullRequest
3 голосов
/ 18 апреля 2019

У меня есть родительский процесс, в котором есть некоторые дочерние элементы, которым не нужен дескриптор FIFO, открытый родительским элементом перед разветвлением.Я попытался сделать следующие подходы, которые

  • fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); после открытия FD.
  • fd = open(/tmp/testfifo, O_RDONLY|O_CLOEXEC|O_NONBLOCK);

Чтобы увидеть, работает ли он правильноЯ делаю следующие шаги, но первый не работает, так как он определен как ошибка .Однако я не понимаю, что не так со вторым.

Первый подход,

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

Мой подход неверен?Или я сделал что-то не так?Или я неправильно понял обоснование флага?

...