父进程创建子进程并且父进程和子进程运行相同程序的不同代码的程序

时间:2013-04-18 08:00:41

标签: c unix process fork

//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,我希望在程序执行结束后控制转移到终端。

2 个答案:

答案 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