2012-07-02 33 views
0

就是孩子,叉后,从一开始还是从家长是地方启动程序?叉:哪里的孩子开始运行?

例如,它这个程序中,在子从第1行或第3行开始?

int i=1 
fork() 
i=i*2 
fork 
i=i*2 
+1

子进程和父进程几乎分叉后的相同,这意味着这两个孩子和家长将继续从行执行后叉'()'。 – nhahtdh

+0

这个问题是用极低的质量制定的。请问我们什么时候请多考虑10秒。 –

+1

因此,不是花时间写完这个问题,而是没有做出基本的printf()调试来解决这个问题?这里是代码:int main(void){printf(“starting \ n”); switch(fork()){case 0:printf(“分叉进程\ n”);打破;默认:printf(“父进程\ n”); break;} exit(0); } – tbert

回答

0

叉从管线3,叉发生的位置处开始。

6

fork()通过复制调用进程来创建一个新进程。从fork(2)

为[...]

: 新工艺,被称为孩子,是 一个确切的重复调用的过程中,被称为父,除了 以下几点它是完全重复的,它也会有相同的指令指针和堆栈。所以孩子会调用fork()之后。现在,您可能会问,我如何确定当前的计划是孩子还是父母?查看返回值的手册页:

成功时,子进程的PID返回父, 和0的孩子返回。如果失败,则返回-1在 父,没有创建子进程,并errno设置为合适。

所以如果fork()结果等于0,你在孩子过程中,如果其大于0你的父母是,如果它的下面0你就麻烦了。

请注意,这意味着,每一个代码是独立的fork()结果值,将在的孩子和家长被执行。所以,如果你是例如创建与16级的进程池中,你应该做的:

for (int i = 0; i < 16; i++) { 
    pid_t pid = fork() 
    if (pid == 0) { 
     do_some_work(); 
     exit(0); 
    } else if (pid < 0) { 
     // fork failed 
     do_some_error_handling(); 
    } 
} 

如果你错过了exit(0),你会产卵2 16-1处理(在那里,只是用100代替16没有乐趣。)

0

当叉的回报,它在这两个父(返回子进程的PID)和(返回0)的孩子返回。执行继续从父母和孩子那里。

这样,典型的使用叉的是这样的:

if (0 == (child = fork())) 
    // continue as child. 
else 
    // Continue as parent. 
0

Child将在第2行,即,fork()被创建但它将从线3即i = i*2开始执行。这里让我困惑的是你的路线4.你想在那里做什么?

+0

我想他正在尝试在第4行再次fork(),他可能已经忘记了这个制动器。 – doniyor

+2

C :-)这是一个错误 – Abhineet

+1

是的,大错! :d – doniyor