【问题标题】:A program where parent process creates a child process and both parent and child run same program different code父进程创建子进程并且父进程和子进程运行相同程序不同代码的程序
【发布时间】:2013-04-18 08:00:40
【问题描述】:
//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 ,我希望在程序执行结束后控制权转移到终端。

【问题讨论】:

  • 如果你想“先发生”,为什么还要并行编程?那为什么不按顺序写呢?也就是说,您可以选择无数种选择,例如使用互斥锁、延迟等……但对于您的场景,您根本不需要并行进程。
  • 我确实先按顺序编写了子进程,但我首先获得了父进程:(对于互斥锁、延迟等术语也是新手!
  • 是的,unwind 的回答说得非常准确……它们应该并行运行。这意味着它们都有自己的处理器时间片,并轮流“执行”(多任务处理的基础知识)。现在,您的子进程几乎总是会稍微落后于您的父进程,因为父进程在其当前时间片结束之前仍然是“它”,而子进程必须等待轮到他。

标签: c unix process fork


【解决方案1】:
#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) 表示子进程,pid > 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 

【讨论】:

    【解决方案2】:

    并行流程的问题在于它们不能很好地映射到“先发生”的想法;它们并行运行

    当然,您可以通过在打印输出之前延迟父代码中的代码来更改赔率。

    完全不确定您所说的“控制权转移到程序”是什么意思;因为这两个进程在打印它们的消息后都会很快到达exit(),所以应该没有程序可以转移控制权。

    请注意,您不需要使用main() 中的exit(),它应该以普通的旧return 结尾,因为它的返回类型是int

    【讨论】:

    • 控制权转移到程序意味着当程序完成其输出时,光标仍保留在程序中!
    • @AshutoshSingh 好吧……我还是觉得很难相信,程序在你打印到exit()之后就没有更多的内容了,什么都没有了。这一定是一些人为的你的环境或其他东西。
    • 孩子去后台?父母到达exit(),但孩子仍然执行。它们是独立的进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多