如何处理多线程进程的fork错误?

时间:2012-02-20 01:01:39

标签: c multithreading pthreads fork

我正在开发一个多线程进程,它会执行另一个进程。有时,如果执行文件不存在,fork可能会出错。由于此进程在fork之前运行了多个线程,因此我有几个问题:

  1. 是否将线程复制到分叉进程。
  2. 使用多线程进程从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);
    }
    

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函数之间调用需要某些资源的函数的效果是未定义的。