产卵C子过程针对不同的工作?

时间:2014-09-08 14:06:39

标签: c linux fork

所以我正在尝试申请fork() 2个孩子。

  • 首先执行for(i=1; i<=50000; i++)循环
  • 第二个for(i=50000; i<=100000; i++)循环
  • 父母for(asciic=65; asciic<=90; asciic++) - &gt;用于打印A到Z字母的循环

我需要所有三个人一起工作,而不是一个接一个地工作。

我查看了互联网,我找不到合适的方式,我找到的只是创建子进程的循环,但它们几乎完全相同,大多数都是一个接一个地创建的。

感谢任何帮助。

要更加了解,这是我在发布之前所做的:

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

int main(void) {
    pid_t child_pid,child_pid1;
    int i=0;
    int stare;
    int asciic;

    child_pid=fork();
    child_pid1=fork();

    if (child_pid==0) {
        //printf("Father PID: %d -> Child 1: %d\n",getppid(),getpid());
        for(i=1; i<=50000; i++){
            printf("%d-%d\n",getpid(),i);
        }
        exit(0);
    } else if (child_pid1==0) {
        //printf("Father PID: %d -> Child 2: %d\n",getppid(),getpid());
        for(i=50000; i<=100000; i++) {
            printf("%d-%d\n",getpid(),i);
        }
        exit(0);
    } else {
        //printf("PID-ul procesului parinte: %d\n", getpid());
        pid_t rez=waitpid(child_pid,&stare,WNOHANG);
        pid_t rez1=waitpid(child_pid1,&stare,WNOHANG);
        while(rez==0 || rez1==0){
            for(asciic=65; asciic<=90; asciic++){
                printf("%d- %c\n",getpid(),asciic);
            }
            rez=waitpid(child_pid,&stare,WNOHANG);
            rez1=waitpid(child_pid1,&stare,WNOHANG);
        }

    }

    return 0;
}

如果我注释掉循环,我可以看到孩子有不同的PID,1个孩子有正确的父PID,而其他孩子有其他父PID。

3 个答案:

答案 0 :(得分:2)

你的两条叉子:

child_pid=fork();
child_pid1=fork();

不要创建2个孩子,而是创建3个孩子:父母在第一个fork()中创建第一个孩子。从那一刻起,有两个过程:父母和孩子。并且每个人都执行第二个fork()。你将有1个父母,2个孩子和1个孙子。

为了只有1个父母和2个孩子,您必须:

pid1 = fork();
if (pid1 < 0) {
    /* Error in fork() */
} else if (pid1 == 0) {
    /* first child */
    exit(0);
}

pid2 = fork();
if (pid2 < 0) {
    /* Error in fork() */
} else if (pid2 == 0) {
    /* second child */
    exit(0);
}

/* parent */

此外,即使你的代码是正确的,你也不能“看到”进程是同时运行还是不只是查看它们的输出。事实上,即使有多个进程“同时”执行,您可能会看到其中一个进程在另一个进程启动之前完成。这是因为内核通常会进行时间多路复用,为每个孩子提供一些CPU时间。如果流程需要更长时间才能完成,您可以看到并发性,例如添加一些sleep()

答案 1 :(得分:1)

fork()将子项的pid_t返回给调用者(父项),如果失败则返回-1。在孩子中,返回0。你可以简单地测试一下

if (fork())
    {
        //do one thing
    }
else
    {
        //do something else
    }

答案 2 :(得分:1)

问题在于:

child_pid=fork();
child_pid1=fork();   // This line will be executed by both parent and first child!!!

你需要将第二个fork移动到第一个fork的父部分中,然后为第二个子节点设置一个单独的if。