我在C程序中连续3次拨打
1.它会以相同的顺序执行吗? (我的猜测是肯定的)
2.如果我从shell中执行pgrep myexecutable
,它是否会以与启动时相同的顺序给出进程ID? (我的猜测是否定的,因为你无法保证系统给孩子什么样的pid,对吗?)
答案 0 :(得分:4)
执行3个forks后,总共会有8个进程在运行
所以现在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
输出。 )