管理多个流程以在C

时间:2017-03-06 09:42:37

标签: c multiprocessing fork

我编写了一些代码,某些进程使用数组,对其进行排序然后打印。实际上我想要做的是每个进程应该对主进程提供给它们并打印它们的整数数字进行排序,然后将它们发送回主进程。该算法在没有进程和分叉的情况下工作正常。但是当我添加分叉时,某些过程会导致打印或执行一次或多次指令。请让我知道如何管理它。

以下是代码:

 if (N<=NumberOfLines)
    {
        PortionOfProcess=NumberOfLines/N;
        for (int i=0;i<N;i++)//making N process using fork
        {
            for (int j=0; j<PortionOfProcess; j++)//For using from function by a single process
            {
                int pointer=i*PortionOfProcess+j;//this points to the line for each process
                printf("poniter: %d . the i is %d, the j is: %d and the portionprocess is : %d\n",pointer,i,j,PortionOfProcess);

                fileopener(B_result,pointer);


                mypid=fork();
                if (mypid==0)//child
                {
                    ///////////do the sorting
                    for (int j=0 ; j<(y-1) ; j++)
                    {
                        for (int i=0 ; i<(y-1) ; i++)
                        {
                            if (B_result[i+1] < B_result[i])
                            {
                                t = B_result[i];
                                B_result[i] = B_result[i + 1];
                                B_result[i + 1] = t;

                            }
                        }
                    }
                    for (int j=0 ; j<y ; j++)
                    {
                        printf("SORTED %d \n",B_result[j]);
                    }
                //////////////////end sorting
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

  

我是C编程的新手。我编写了一些代码,某些进程使用数组,对其进行排序然后打印出来。该算法适用于进程和分叉

以下是fork()的作用:它创建了一个过程的全新副本,在大多数情况下,它完全独立于原始副本。但是,原始父进程不会等待子进程完成。也没有任何与孩子沟通的方式。

你想要做的事实上非常复杂。父进程和子进程需要创建某种通信通道。这通常由creating a pipe在它们之间完成。然后,子进程将像普通文件一样写入管道,父进程将从管道中读取。逻辑看起来像这样:

create pipe
fork
if parent close write end of the pipe
if child close read end of pipe
然后孩子们做他们的东西并正常退出。但是,父母有一大堆要阅读的文件,并且不知道要读取哪个文件。在你的情况下,孩子们相当简单,所以你可能只是按照你创建它的顺序阅读每一个。 ,但您可能还想查看select,以便按照他们准备好的顺序阅读结果。

最后,您需要调用wait or waitpid以便获得每个孩子的返回状态,并且您最终不会得到zombie processes,这是可能的,因为父母阻止来自各种管道的输入,你犯的任何错误都可能导致它永远等待(或直到被杀)。