#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #define LOG_FILE_PATH "./test.log" int main(int argc, char **argv) { int fd, size; char buf[128]; fd = open(LOG_FILE_PATH, (O_RDONLY | O_CREAT), 0664); if (fd < 0) { return -1; } int flags = fcntl(fd, F_GETFD); flags |= FD_CLOEXEC; fcntl(fd, F_SETFD, flags); sleep(60); }
フラグを見る
こんな感じになっているはず。02100000がフラグ
pos: 0 flags: 02100000 mnt_id: 30 ino: 3622804
意味を調べる
コンパイラに出力してもらう。
for flag in APPEND ASYNC CLOEXEC CREAT DIRECT DIRECTORY DSYNC EXCL LARGEFILE NOATIME NOCTTY NOFOLLOW NONBLOCK PATH SYNC TMPFILE TRUNC; do printf '%s: ' O_$flag; echo O_$flag | gcc -D_GNU_SOURCE -include fcntl.h -E - | tail -n 1; done O_APPEND: 02000 O_ASYNC: 020000 O_CLOEXEC: 02000000 O_CREAT: 0100 O_DIRECT: 040000 O_DIRECTORY: 0200000 O_DSYNC: 010000 O_EXCL: 0200 O_LARGEFILE: 0 O_NOATIME: 01000000 O_NOCTTY: 0400 O_NOFOLLOW: 0400000 O_NONBLOCK: 04000 O_PATH: 010000000 O_SYNC: 04010000 O_TMPFILE: (020000000 | 0200000) O_TRUNC: 01000
このうちO_CLOEXEC: 02000000
が立っているのでFD_CLOEXECが有効になっていそうということがわかる