2009-05-18 44 views
13

有人可以帮助我了解如何创建多个具有相同父项的子进程以完成特定任务的“某些”部分?多个子进程

例如,应用子进程的外部排序算法;每个子进程排序数据的一部分,并最终母公司合并他们..

编辑:也许我应该提到与环分岔多个子进程..

+0

wouldnt你最好与线程? – AviD 2009-05-18 07:41:49

+0

那么,这可能是正确的..但我需要实践多叉(),这意味着多个子进程。 – israkir 2009-05-18 07:46:02

回答

3

你可以用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 
} 
+0

我们不应该也考虑这种情况,其中xxxChild <0会引发错误?我认为(xxxChild> 0)将是一个更合适的... – CHANist 2015-10-02 02:19:46

+0

@CHANist,谢谢,现在应该被覆盖。 – 2015-10-03 02:05:17

38

这里是如何叉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. 
} 
5

我认为这将指出值得为什么线程是比较合适的位置:

正如你试图并行地完成工作的“部分”,我假设你的程序需要知道计算结果。 fork()之后,fork的进程不会共享更多的初始信息。一个过程中的每一个变化都不知道另一个过程,你需要将这些信息作为消息传递(例如通过管道,参见“人管”)。 一个进程中的线程共享相同的地址空间,因此能够操纵数据并让它们可见于其他“立即”。还增加了更轻量级的好处,我会去与pthreads()。毕竟:如果你仍然使用pthread,你将会学到所有你需要知道的有关fork()的知识。

1

如果你想启动几个分支,你应该递归地做。这是因为你必须从父进程调用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); 
     } 
    } 
}