c - 当线程 fork 时会发生什么?

标签 c linux operating-system pthreads fork

我知道从线程调用 fork() sys_call 是个坏主意。 但是,如果一个线程使用 fork() 创建一个新进程会发生什么?

新进程将是创建该线程的主线程的子进程。我想。

如果其父进程先完成,则新进程将附加到 init 进程。 它的父线程是主线程,而不是创建它的线程。

如果我错了,请纠正我。

#include <stdio.h>
#include <pthread.h>

int main () 
{
     thread_t pid;
     pthread_create(&(pid), NULL, &(f),NULL);
     pthread_join(tid, NULL);
     return 0;
}

void* f()
{
     int i;
     i = fork();

     if (i < 0) {
         // handle error
     } else if (i == 0) // son process
     {
          // Do something;
     } else {
          // Do something;
     }
 }

最佳答案

The new process will be the child of the main thread that created the thread. I think.

fork 创建一个新进程。进程的父进程是另一个进程,而不是线程。所以新进程的父进程是旧进程。

请注意,子进程将只有一个线程,因为 fork 只会复制调用 fork 的线程(堆栈)。 (这并不完全正确:整个内存被复制,但子进程将只有一个事件线程。)

If its parent finishes first, the new process will be attached to init process.

如果父进程先完成,一个SIGHUP信号被发送给子进程。如果子进程没有因为 SIGHUP 而退出,它将获得 init 作为它的新父进程。有关 SIGHUP 的更多信息,另请参阅 nohupsignal(7) 的手册页。

And its parent is main thread, not the thread that created it.

进程的父进程是进程,而不是具体的线程,所以说主线程或子线程是父进程是没有意义的。整个过程都是父进程。

最后一点:必须小心混合线程和 fork 。讨论了一些陷阱 here .

关于c - 当线程 fork 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39890363/

相关文章:

c - 给定一个带有信号名称的字符串,如何获得适当的信号编号?

c - 字符串中每个单词的频率

尝试使用指向此指针的指针重新分配指针时崩溃

linux - 汇编语言问题...以及如何换行?

java - 什么是非 unicode 应用程序

c - scanf语句中这些符号的使用是什么意思?

linux - 连接 PDF,同时保留列表中的排名

linux - 在 PostgreSQL 函数中使用参数运行系统命令

c++ - 判断进程是否挂起

c# - 使 C# 程序能够在任何操作系统上编译