我刚刚调试了一个大致能完成的程序:
pthread_create(...);
close(0);
int t = open("/named_pipe");
assert(t == 0);
有时会失败,因为pthread_create
实际上会短暂地在新线程上打开文件描述符-特别是/sys/devices/system/cpu/online
-如果不幸的话,它会出现在close
和open
之间,使t
的值不是0。
最安全的方法是什么?如果可以保证有关pthread_create
关于文件描述符的一切,该怎么办?我是否可以保证如果在调用pthread_create之前打开了3个文件描述符,那么当它返回并且控制权已传递给新线程上的函数时,也将打开3个文件描述符吗?
答案 0 :(得分:3)
在多线程程序中,您需要使用dup2
or dup3
来替换文件描述符。在close
之后立即重用的旧技巧不再起作用,因为其他线程会随时创建文件描述符。此类文件描述符甚至可以由glibc隐式创建(和关闭),因为许多内核接口都使用文件描述符。
dup2
是标准界面。 Linux还具有dup3
,您可以使用它O_CLOEXEC
来自动创建文件描述符。否则,仍将存在竞争条件,并且如果进程曾经分叉并执行新程序,则描述符可能会泄漏给子进程。