fork()之后的PID是什么?

时间:2011-02-15 09:48:23

标签: pid fork

我在C程序中连续3次拨打 1.它会以相同的顺序执行吗? (我的猜测是肯定的) 2.如果我从shell中执行pgrep myexecutable,它是否会以与启动时相同的顺序给出进程ID? (我的猜测是否定的,因为你无法保证系统给孩子什么样的pid,对吗?)

2 个答案:

答案 0 :(得分:4)

执行3个forks后,总共会有8个进程在运行

enter image description here

所以现在pid将取决于创建子进程的顺序以及创建子进程的子顺序。

可能就像

main - 12345

child1_of_main_after_fork1  12346

child2_of_child1_after_fork2  12347

child3_of_main_after_fork2 12348

child4_of_main_after_fork3 12349

child5_of_child1_after_fork3 12350

child6_of_child2_after_fork3 12351

child7_of_child3_after_fork3 12352

答案 1 :(得分:3)

Shrinath,您应该查看fork()的文档,这里是:

Upon successful completion, fork() returns a value of 0 to the child
process and returns the process ID of the child process to the parent
process.  Otherwise, a value of -1 is returned to the parent process, no
child process is created, and the global variable errno is set to indi-
cate the error.

这对您来说意味着,这意味着您的父进程在分叉时将获得子进程的PID。孩子知道这是孩子,因为fork()将给孩子返回0,所以类似于:

if((cpid = fork()))
{ 
  // This is the parent processs, child pid 
  // is in `cpid` variable
}else{
  // This is the child process, do your child
  // work here.
}

请注意你获得减号的机会(所以没有孩子),你应该检查一下。

ps的输出因系统而异,但如果查看整个树,您应该看一个示例(让您的进程保持睡眠状态,以便您有时间检查ps输出。 )