保存在一个变量中fork的returnin值C
问题描述:
我对函数fork返回的值有点困惑。据我所知,值0
是child
过程和值>0
是为parent
过程。 我具有低于保存在一个变量中fork的returnin值C
int main()
{
int pid;
pid = fork();
if(pid == 0)
//DO SOMETHING
else
//DO SOMETHING ELSE
return 0;
}
的valiable pid
叉后的代码对每个过程不同? 我无法理解它如何切换价值。我有一个第二部分的代码
int main()
{
int pid;
if (pid == 0)
{
return 5;
}
printf("parent = %d waits for child = %d ", getpid(), pid);
waitpid(pid, NULL, 0);
printf("child terminates!")
return 0;
}
中,我不明白为什么与第一printf
行PID有孩子的价值。它不应该是父母的id
?
答
fork后的可变pid对于每个进程是不同的?
是的,这是您获得的新的进程ID作为返回值。无法同时使用相同ID的进程,因此无论何时您通常都会获得唯一的进程。
该进程被克隆,但仍在fork()
调用中,包括所有可变内存内容(堆,堆栈,数据段)的副本。一旦拷贝完成,内核恢复执行这两个进程,但给出不同的返回值。
其中我不明白为什么与第一个printf匹配的pid具有child的值。它不应该是父母的身份?
getpid()
返回父代的ID,因为这是您现在执行它的上下文。在这个例子中,pid
只是垃圾(未初始化的内存),所以不管你认为你看到了什么,它不是一个进程ID,而只是一些随机存储器内容。
在第二个问题中,你说'PID'不是进程ID。但父母使用waitpid()等待子进程并等待。那么为什么它不是一个进程ID? –
@DimitrisMpl它是一个堆栈分配的整数变量,根本没有初始化。它与您在另一个函数中使用的“pid”变量不同,尽管名称相同。所以它只包含上次写入堆栈的地方。 – Ext3h