2013-04-24 28 views
0

我被问及这个问题的作业,并且无法找出答案。如果任何人都可以帮助我,我会非常感激。在C中使用fork()?

什么Linux库函数就像一个fork(),但父进程终止?

+1

有没有AFAIK,虽然也许仰视'exec'将是有益的,因为它是结合经常使用'叉'(例如[“fork-exec”](http://en.wikipedia.org/wiki/Fork-exec))。 – user2246674 2013-04-24 02:10:31

回答

2

我相当肯定,无论谁赋予你这个功课寻找exec()家庭的功能,从POSIX API头<unistd.h>,因为没有别的更类似于排序的功能,你描述。

exec()函数族执行一个新进程,并用新执行的进程替换当前正在运行的进程地址空间。

man page

的EXEC()函数系列有 一个新的进程图像替换当前的进程图像。

它与“终止”父进程不完全相同,但实际上它导致父进程地址空间被子进程的地址空间擦除(替换)的类似情况。

+0

所以你说exec是库函数? – 2013-04-24 02:11:53

+0

非常感谢你,这很有道理我非常感谢你的帮助。 – 2013-04-24 02:15:52

0

什么Linux库函数就像fork(),但父进程 终止?

父进程不应该终止,因为它必须等待子进程完成执行,之后它们将处于一个称为“僵尸状态”的状态,现在清理它是父级的责任孩子过程的剩菜。父进程可以在不清理子进程的情况下终止,但是,这不是一个正确的方法,因为子进程的退出状态应该由父进程收集和检查。

下面是一个例子,来证明,我刚才说的...

#include<stdio.h> 
#include<unistd.h> 
#include<sys/wait.h> 

int main() 
{ 
    pid_t cpid = 1 ; 
    int status; 

    cpid = fork(); 

    // Load a application to the child using execl() , and finish the job 

    printf("Parent waiting for child to terminate\n"); 

    int wait_stat = waitpid(-1,&status,0);  // Parent will hang here till all child processes finish executing.. 
    if (wait_stat < 0) 
    { 
    perror("waitpid error"); 
    exit(-1); 
    } 

    // WIFEXITED and WEXITSTATUS are macros to get exit status information, of the child process 

    if (WIFEXITED (status))   
    { 
    printf("Child of id %u cleaned up\n",wait_stat); 
    printf("Exit status of application = %u\n",WEXITSTATUS(status)); 
    } 

} 
+0

父进程可以终止,在这种情况下,对子进程使用'init'' wait()'。 – 2013-04-24 02:39:08

+0

@JorgeIsraelPeña,是真的,但最好由父母完成,在那里可以解释孩子的退出代码并采取适当的措施 – 2013-04-24 02:40:58

+0

当然,我只是说父母的确可以终止而不用等待儿童;这不一定是一个坏习惯。在某些情况下,父母可能完全不关心孩子的状况。实际上,一种策略包括分叉两次并终止第一个子进程,以便原始进程可以继续处理,而不必关心剩余(第二个)子进程的状态(因为它将由'init'处理)。 – 2013-04-24 02:48:12