isr*_*kir 14 c fork child-process
有人可以帮助我如何创建多个具有相同父级的子进程,以便完成特定工作的"某些"部分吗?
例如,应用子进程的外部排序算法; 每个子进程对一部分数据进行排序,最后父进程合并它们.
编辑:也许我应该提到使用循环分叉多个子进程..
pts*_*pts 46
以下是如何分叉10个孩子并等待他们完成:
pid_t pids[10];
int i;
int n = 10;
/* Start children. */
for (i = 0; i < n; ++i) {
if ((pids[i] = fork()) < 0) {
perror("fork");
abort();
} else if (pids[i] == 0) {
DoWorkInChild();
exit(0);
}
}
/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
pid = wait(&status);
printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
--n; // TODO(pts): Remove pid from the pids array.
}
Run Code Online (Sandbox Code Playgroud)
我认为值得指出为什么线程在这里更合适:
当您尝试并行执行作业的"部分"时,我假设您的程序需要知道计算的结果.fork()之后,fork()的进程不会比fork()之后的初始信息多.一个进程中的每个更改都是另一个进程未知的,您需要将信息作为消息传递(例如,通过管道,请参阅"man pipe").进程中的线程共享相同的地址空间,因此能够操纵数据并使其与其他"即时"可见.还增加了更轻量级的好处,我会选择pthreads().
毕竟:如果你使用pthreads,你将学习有关fork()的所有知识.
小智 5
如果要启动多个fork,则应递归执行。这是因为您必须从父进程调用fork。否则,如果启动第二个fork,则将同时复制父进程和第一个子进程。这是一个例子:
void forker(int nprocesses)
{
pid_t pid;
if(nprocesses > 0)
{
if ((pid = fork()) < 0)
{
perror("fork");
}
else if (pid == 0)
{
//Child stuff here
printf("Child %d end\n", nprocesses);
}
else if(pid > 0)
{
//parent
forker(nprocesses - 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以用fork来做到这一点。给定的父级可以根据需要多次分叉。不过,我同意 AviD pthreads可能更合适。
pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
// In parent
secondChild = fork();
if(secondChild > 0)
{
// In parent
}
else if(secondChild < 0)
{
// Error
}
else
{
// In secondChild
}
}
else if(firstChild < 0 )
{
// Error
}
else
{
// In firstChild
}
Run Code Online (Sandbox Code Playgroud)