关于pthread_create和文件描述符,我可以假设什么?

时间:2018-06-28 01:25:18

标签: linux pthreads posix file-descriptor

我刚刚调试了一个大致能完成的程序:

pthread_create(...);
close(0);
int t = open("/named_pipe");
assert(t == 0);

有时会失败,因为pthread_create实际上会短暂地在新线程上打开文件描述符-特别是/sys/devices/system/cpu/online-如果不幸的话,它会出现在closeopen之间,使t的值不是0。

最安全的方法是什么?如果可以保证有关pthread_create关于文件描述符的一切,该怎么办?我是否可以保证如果在调用pthread_create之前打开了3个文件描述符,那么当它返回并且控制权已传递给新线程上的函数时,也将打开3个文件描述符吗?

1 个答案:

答案 0 :(得分:3)

在多线程程序中,您需要使用dup2 or dup3来替换文件描述符。在close之后立即重用的旧技巧不再起作用,因为其他线程会随时创建文件描述符。此类文件描述符甚至可以由glibc隐式创建(和关闭),因为许多内核接口都使用文件描述符。

dup2是标准界面。 Linux还具有dup3,您可以使用它O_CLOEXEC来自动创建文件描述符。否则,仍将存在竞争条件,并且如果进程曾经分叉并执行新程序,则描述符可能会泄漏给子进程。