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 カーネルでは失敗します。
どうしたの?ありがとう!