首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fork()、exec和waitpid()

fork()、exec和waitpid()
EN

Stack Overflow用户
提问于 2012-09-05 02:12:57
回答 4查看 3.7K关注 0票数 5

我读了之前的问题Differences between fork and exec,但它给我留下了一些疑问。

当使用fork()并对子进程调用exec时,由exec创建的新进程仍然是子进程,对吗?

杀死父进程是否也会杀死子进程?

the top answer所示的绘图/示例中,他调用了wait/waitpid,因为如果父进程首先终止,子进程就会终止,然后您会得到ls命令的部分输出或没有输出,对吗?

EN

回答 4

Stack Overflow用户

发布于 2012-09-05 02:34:11

exec用一个新的进程映像替换当前正在执行的进程映像。所以,是的,子进程仍然是子进程(它实际上是相同的进程)。

不,杀死父母并不会杀死孩子(孩子是orphaned)。

票数 3
EN

Stack Overflow用户

发布于 2012-09-05 02:31:58

杀死父进程并不会杀死子进程。当子进程调用exec函数时,它仍然是一个子进程。

在链接问题的示例中,流程图大致描述了shell调用命令的过程。除非命令是基于后台的,否则shell -父进程-将等待到子进程终止,然后再继续读取命令。不然的话,就没有必要等孩子了。

另请参见this question

票数 2
EN

Stack Overflow用户

发布于 2012-09-05 02:39:49

当使用fork()并对子进程调用exec时,exec创建的新进程仍然是子进程,对吗?

对子进程调用exec时,子进程将对新进程进行处理。子进程被exec调用所取代。

杀死父进程也会杀死子进程吗?

如果父进程死了(至少在Linux中),子进程也有可能死掉,这是因为操作系统发送了一个信号,否则子进程就会继续存在。

他之所以调用

/waitpid,是因为如果父进程首先终止,子进程就会终止,然后ls命令会得到部分输出或没有输出,对吗?

您可能希望等待子进程(如您所指的示例),以便: a)完成时可以正确地终止子进程;b)子进程可以访问父进程的所有资源……这意味着如果您的子进程有一个由父进程打开的文件句柄,并且父进程退出,但是子进程假定文件只要运行就会打开,那么就会发生不好的事情。

看一下这个简单的例子:首先,看一下进程清单的输出:

代码语言:javascript
复制
mike@linux-4puc:~> ps
PID TTY          TIME CMD
18577 pts/2    00:00:00 bash
18643 pts/2    00:00:00 ps

然后运行这个小程序:

代码语言:javascript
复制
void main() 
{ 
    if(fork()){
      printf("parent print");
    }
    else
      while(1);
    printf("done");
}

在这里,您将让父进程打印消息"parent print“,然后打印"done”。检查完成后的"ps“列表,您将看到树中挂起了一个新进程:

代码语言:javascript
复制
mike@linux-4puc:~> ps
PID TTY          TIME CMD
18577 pts/2    00:00:00 bash
18673 pts/2    00:00:02 a.out
18678 pts/2    00:00:00 ps

该a.out是子进程,当父进程终止时,它将永远处于while循环中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12269134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档