在C中管理多个进程以完成相同的任务
我编写了一个代码,让一些进程使用数组,对它进行排序,然后打印它。事实上,我想做的是,每个进程都应该对主进程提供给它们的一行整数进行排序并打印它们,然后将它们发送回主进程。该算法运行良好,无需处理和分叉。但当我添加分叉时,某些进程会导致多次打印或执行某些指令。请让我知道如何管理它 代码如下:在C中管理多个进程以完成相同的任务,c,multiprocessing,fork,C,Multiprocessing,Fork,我编写了一个代码,让一些进程使用数组,对它进行排序,然后打印它。事实上,我想做的是,每个进程都应该对主进程提供给它们的一行整数进行排序并打印它们,然后将它们发送回主进程。该算法运行良好,无需处理和分叉。但当我添加分叉时,某些进程会导致多次打印或执行某些指令。请让我知道如何管理它 代码如下: if (N<=NumberOfLines) { PortionOfProcess=NumberOfLines/N; for (int i=0;i<N;i+
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
}
}
}
}
if(N
我是C编程新手。我写了一个代码,一些进程使用数组,对它进行排序,然后打印出来。这个算法可以很好地处理out进程和forking
以下是fork()
所做的:它创建一个进程的完整新副本,在大多数情况下,该副本完全独立于原始副本。但是,原始父进程不会等待子进程完成。它也没有任何与子进程通信的方式
您想要做的实际上相当复杂。父进程和子进程需要创建某种通信通道。这通常由它们之间完成。然后子进程将像普通文件一样写入管道,父进程将从管道中读取。逻辑如下所示:
create pipe
fork
if parent close write end of the pipe
if child close read end of pipe
然后孩子们做他们的事情,然后正常退出。然而,家长们有一大堆文件要读,不知道读它们的顺序。在你的情况下,孩子们相当简单,所以你可能只需要按照你创建的顺序读每一个,但你也可能想看,这样你就可以按照他们的顺序读结果了我们准备好了
最后,您需要调用,以便获得每个子级的返回状态,而不会最终导致返回状态,因为由于父级阻止来自不同管道的输入,您犯的任何错误都可能导致它永远等待(或直到被杀死).您的问题相当不清楚。当您从多个没有子标识的子进程打印时,子进程的输出将随机混合。您想实现什么?@SergeBallesta:谢谢您的回答,我想做的是,每个进程都应该对主进程提供给它们的一行整数进行排序,然后打印出来然后将它们发送回主进程。正如您所说,我应该将打印内容放在子进程中。对吗?您的代码中从不将数据发送回主进程。为此,您需要使用共享内存、管道或进程间通信功能。对此的解释对于这样的回答来说太长了:-(我的建议是用谷歌搜索共享内存或管道,尝试一下,然后带着更精确的问题返回这里。@SergeBallesta:非常感谢。但是,你能告诉我为什么现在代码中有一些重复打印数据吗?@SergeBallesta:我认为一些进程同时访问数组单元!