我正在开发一个多线程进程,它会执行另一个进程。有时,如果执行文件不存在,fork可能会出错。由于此进程在fork之前运行了多个线程,因此我有几个问题:
使用多线程进程从fork处理错误的最佳做法是什么。例如:
/* in a multithreaded process */
pid = fork();
if(pid == 0)
{
execlp(filename, filename, NULL);
fprintf(stderr, "filename doesn't exist");
/* what do i do here if there's multiple threads running
from the fork? */
exit(-1);
}
答案 0 :(得分:4)
如果可执行文件不存在,fork
不会出错。在这种情况下出现exec
错误。但是,对于实际的问题,POSIX声明fork
使用单个线程创建一个新进程,该线程的副本调用fork
。有关详细信息,请参阅here:
应使用单个线程创建进程。如果多线程进程调用fork(),则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥锁和其他资源的状态。
因此,为避免错误,子进程可能只执行异步信号安全操作,直到调用其中一个exec函数为止。
所以你有什么是好的,如果有点稀疏: - )
单个线程将在子级中运行,如果您不能exec
另一个程序,请记录一条消息并退出。
而且,在理由部分,它解释了为什么这样做:
POSIX程序员调用fork()有两个原因。一个原因是在同一个程序中创建一个新的控制线程(最初只能通过创建一个新进程在POSIX中实现);另一种是创建一个运行不同程序的新进程。在后一种情况下,对fork()的调用很快就会调用其中一个exec函数。
使fork()在多线程世界中工作的一般问题是如何处理所有线程。有两种选择。一种是将所有线程复制到新进程中。这会导致程序员或实现处理在系统调用上挂起的线程,或者可能即将执行不应在新进程中执行的系统调用的线程。另一种方法是只复制调用fork()的线程。这就产生了进程本地资源的状态通常保存在进程内存中的困难。如果没有调用fork()的线程拥有资源,那么该子资源永远不会在子进程中释放,因为子进程中不存在要释放资源的线程。
当程序员编写多线程程序时,pthread_create()函数提供了第一次使用fork(),在同一程序中创建新线程。因此,fork()函数仅用于运行新程序,并且在调用fork()和调用exec函数之间调用需要某些资源的函数的效果是未定义的。