//same program different code
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int pid;
pid=fork();
if(pid<0)
{
printf("\n Error ");
exit(1);
}
else if(pid==0)
{
printf("\n Hello I am the child process ");
printf("\n My pid is %d ",getpid());
exit(0);
}
else
{
printf("\n Hello I am the parent process ");
printf("\n My actual pid is %d \n ",getpid());
exit(1);
}
}
我试过这个,我希望它是正确的 但我对输出不满意。
输出结果为:
Hello I am the parent process
My actual pid is 4287
ashu@ashu-VirtualWorld:~/Desktop/4thSemester/testprep$
Hello I am the child process
My pid is 4288
请帮助我,我无法理解它的输出,我希望先进行子进程然后再进行父进程。 另外,当执行结束时控制转移到程序,所以返回终端我必须使用ctrl + c,我希望在程序执行结束后控制转移到终端。
答案 0 :(得分:7)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
int main()
{
int status;
int pid;
pid=fork();
if(pid<0)
{
printf("\n Error ");
exit(1);
}
else if(pid==0)
{
printf("\n Hello I am the child process ");
printf("\n My pid is %d ",getpid());
exit(0);
}
else
{
wait(&status);
printf("\n Hello I am the parent process ");
printf("\n My actual pid is %d \n ",getpid());
exit(1);
}
}
在这个程序中,if(pid == 0)表示child和pid&gt; 0表示父母 父和子在同一时间运行访问相同的资源,因此出现竞争条件的问题。 哪一个首先访问它首先执行的资源而另一个是 在以后执行。
等待函数避免竞争条件以及子执行完成时 直到父等待并执行父
之后默认vfork避免竞争条件
pid=vfork();
Because the vfork use the parent wait for until the child complete.
此外,如果您想获取父进程的进程ID。使用int ppid = getppid()函数。
该计划的输出是:
Hello I am the child process
My pid is 7483
Hello I am the parent process
My actual pid is 7482
答案 1 :(得分:6)
并行处理的事情是它们没有很好地映射到“先发生”的想法;他们并行运行 。
当然,您可以通过在打印输出之前延迟父代码来更改赔率。
完全不确定“控件转移到程序”是什么意思;由于两个进程在打印完邮件后会很快达到exit()
,因此不应该有任何程序将控制转移到。{/ p>
请注意,您不需要使用exit()
中的main()
,它应该以普通的return
结尾,因为其返回类型为int
。