系统如何调用以下程序?

时间:2016-03-04 03:29:08

标签: c unix system-calls

我想知道forkwaitexit如何相互沟通。 &nexit(0)中传递的内容会返回父进程的内容吗?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void){

    int n=5;
    fork();
    wait(&n);
    printf("%d\n", n);
    exit(0);
}

我得到的输出是

sh-4.3$ main
5
0
sh-4.3$

2 个答案:

答案 0 :(得分:1)

fork()创建一个新进程,该进程几乎是进行调用的进程的完全副本。新创建的进程称为子进程。请注意精确复制是一个强有力的假设!这实际上意味着新创建的进程在其创建时处于其父级的确切状态(这是一个稍微粗略的假设,但为了简单起见,将其视为原样)。然后一个进程调用fork,然后两个进程从调用返回! fork是一种克隆计算机(一只羊进入,然后两只羊退出机器!)。通常你应该测试fork的返回值(详见man)。

然后从现在起两个进程独立运行!

一个人打电话给wait,而另一个打电话给waitwait的效果在两者上都不同。对于原始进程,wait将等待子进程终止,然后捕获有关该事件的信息。孩子打电话给wait,但由于没有孩子n什么都不做,所以立即回来。然后打印其变量5的值,该变量未被修改:exit。然后它wait的值为0.所以它终止。这将允许父进程从其0调用中唤醒并捕获其子进程的退出值(0)。然后打印出exit$mail->SMTPDebug = 2; $mail->SMTPAuth = true; // authentication enabled $mail->SMTPSecure = 'tls'; // secure transfer enabled REQUIRED for GMail $mail->Host = 'smtp.gmail.com'; $mail->Port = 465; $mail->Username = "*******"; // SMTP username $mail->Password = "********"; // SMTP password $mail->From = "*******"; //do NOT fake header. $mail->FromName = "test"; $mail->AddAddress($to_email,"test"); // Email on which you want to send mail $mail->IsHTML(true); $mail->Subject = $subject; $mail->Body = $mail_body; s。

请注意,这种情况的某些变体可能会发生,而这不会改变可观察行为,并发运行可能运行

答案 1 :(得分:0)

您可以在手册页上找到这些功能,forkwaitexit

对于fork,我会查找usage examples但是,因为解释起来有点复杂。