在执行c中的代码之前从fork()打印出多个进程ID

时间:2015-02-05 08:25:13

标签: c fork parent-child

对于作业,我应该总共创建四个进程,并为每个进程打印一个多个字母。我应该两次拨打fork()来完成此任务。

我已经能够为每个过程多次打印这些字母。问题的第二部分出现了问题。在我打印出来之前,我打算打印出每个进程的进程ID。输出应如下所示:

Process ID: 123
Process ID: 124
Process ID: 125
Process ID: 126
AAAAABBBBBCCCCCDDDDD

我认为这可以通过使用以下代码来实现:

pid_t child1, child2;
child1 = fork();
child2 = fork();

printf("Process created. ID: %d\n", getpid());

if(child1 == 0) { // print letters }
else if(child2 == 0) { //print letters }
else { // call waitpid and print more letters }

我认为自fork()分割到child1 = fork()行,然后再次在child2 = fork()拆分,然后转到下一行,它会打印出所有内容然后点击if-else声明。但是,这是我的输出:

Process created. ID: 20105
Process created. ID: 20107
AAProcess created. ID: 20106
AAABBBProcess created. ID: 20108
BBCCCCCDDDDD

如何确保首先执行我的Process Created打印语句?

2 个答案:

答案 0 :(得分:0)

child1 = fork(); // Fork 1 here 
child2 = fork(); // Fork 2 here after first fork .!!

上面的fork会生成四个进程。但是,您正在与原始父母以及您的第一个孩子进行第二次fork()。我想这不是你真正需要做的。您只需要使用原始父级启动三个进程。

看一下给定的例子:这里我创建了2个子进程,所有进程数都是3 [使用main]。在这里,我试图提供一个具有所需输出的参考解决方案。

#include <unistd.h>     /* Symbolic Constants */
#include <sys/types.h>  /* Primitive System Data Types */ 
#include <stdio.h>      /* Input/Output */
#include <sys/wait.h>   /* Wait for Process Termination */
#include <stdlib.h>     /* General Utilities */

int main()
{
    pid_t childpid1,childpid2; /* variable to store the child's pid */

    /* now create new process */
    childpid1 = fork();

    if (childpid1 >= 0) /* fork succeeded */
    {
        if (childpid1 == 0) /* fork() returns 0 to the child process */
        {
            printf("1 : %d \n",getpid());

            printf("AA");    
        } 
        else /* fork() returns new pid to the parent process */
        {
             childpid2 = fork();
             if (childpid2 >= 0) /* fork succeeded */
             {
                  if (childpid2 == 0) /* fork() returns 0 to the child process */
                  {
                  printf("2 :%d \n",getpid());

                  int stat;
                  waitpid(childpid1, &stat, 0);

                  printf("BB");    
                  } 
                  else /* fork() returns new pid to the parent process */
                  {
                    printf("3 : %d \n",getpid()); // This is the Original parent of ALL

                    int stat2;
                    waitpid(childpid2, &stat2, 0);

                    printf("CC");             
                  }
             }
        }
    }

    return 0;
}

答案 1 :(得分:-1)

此处存在同步问题:多个进程共享单个资源(stdout)并尝试打印到该资源。这里有两个可能的解决方案:要么创建资源的主要流程管理器,要让子进程向其发送所需的输出(例如使用pipesthis回答可以提示如何执行此操作),或者你需要与semaphores同步使用(here是一个很好的例子)。