2017-09-16 78 views
-2

我对函数fork返回的值有点困惑。据我所知,值0child过程和值>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

回答

0

fork后的可变pid对于每个进程是不同的?

是的,这是您获得的新的进程ID作为返回值。无法同时使用相同ID的进程,因此无论何时您通常都会获得唯一的进程。

该进程被克隆,但仍在fork()调用中,包括所有可变内存内容(堆,堆栈,数据段)的副本。一旦拷贝完成,内核恢复执行这两个进程,但给出不同的返回值。

其中我不明白为什么与第一个printf匹配的pid具有child的值。它不应该是父母的身份?

getpid()返回父代的ID,因为这是您现在执行它的上下文。在这个例子中,pid只是垃圾(未初始化的内存),所以不管你认为你看到了什么,它不是一个进程ID,而只是一些随机存储器内容。

+0

在第二个问题中,你说'PID'不是进程ID。但父母使用waitpid()等待子进程并等待。那么为什么它不是一个进程ID? –

+0

@DimitrisMpl它是一个堆栈分配的整数变量,根本没有初始化。它与您在另一个函数中使用的“pid”变量不同,尽管名称相同。所以它只包含上次写入堆栈的地方。 – Ext3h