地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】ファイルディスクリプタにO_CLOEXECが立っているかを調べる

#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

意味を調べる

コンパイラに出力してもらう。

unix.stackexchange.com

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が有効になっていそうということがわかる