c -使用fork()创建n个子进程,然后处理它们



我想在for循环中通过fork()创建n个子进程,并在所有子进程创建后稍后处理它们。子进程必须被处理父进程已执行。

int main(int argc, char *argv[])
{
char cadena[STRLONG];
pid_t pid;

for(int i =0; i<5; i++){
pid = fork();
if(pid == -1){
perror("Errorn");
exit(-1);
}
else if(pid == 0){
break;
}
}
if (pid > 0){
printf("I'm the parent, --> %dn", getpid());
}
else if(pid == 0){
printf("I'm the child --> %d n", getpid());
exit(0);
}
for(int i = 0; i<5; i++){
wait(NULL);
}
}

这就是我所做的,但是子进程在它们被创建之前被执行,我不知道如何解决它…

当您执行fork()时,父进程和子进程将立即从您执行fork()的位置并行运行。

time     parent      child
|         |
|         |
|       fork()--------+
|         |           |
V         |           |    ​

没有办法知道它们中的哪一个在另一个之前做某事——除非你以某种方式同步它们的动作。

要在进程之间进行适当的同步,可以使用信号量或其他进程间通信技术。对于这个简单的例子,您可以使用旧的自管道技巧
  • 创建pipe
  • 当创建子进程时,关闭子进程中pipe的写入结束—并尝试从pipe读取一个字节。这将挂起,直到有一个字节或pipe关闭。
  • 当所有子进程创建完成后,关闭父进程中的读端。
  • 此时的状态应该是:
    • 父进程只打开pipe的写端
    • 所有子进程只有pipe的读端打开,急切地等待pipe发生什么。
  • 当父进程希望所有子进程都开始工作时,关闭父进程中pipe的写端。这将导致所有子进程中的read操作解除阻塞。

下面没有错误检查,但它会显示思想:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
enum { P_RD, P_WR }; // pipe indices, 0 and 1
int main() {
pid_t pid;
int pip[2];
pipe(pip); // create a pipe from pip[P_WR] to pip[P_RD]
for(int i = 0; i < 5; i++) {
pid = fork();
if(pid == -1) {
perror("Errorn");
exit(1);
} else if(pid == 0) {
close(pip[P_WR]);        // close write end of pipe
char ch;                 // dummy buffer
read(pip[P_RD], &ch, 1); // hang here until closed
close(pip[P_RD]);        // close read end of pipe
printf("I'm the child --> %d n", getpid());
exit(0);
}
}
close(pip[P_RD]); // close read end of pipe
// The state at this point:
// * The parent only has the write end of the pipe open.
// * All the children only have the read end of the pipe open.
printf("I'm the parent --> %dn", getpid());
close(pip[P_WR]); // close write end of pipe to start children
int wstatus;
while((pid = wait(&wstatus)) != -1) {
printf("%d diedn", pid);
}
}

相关内容

  • 没有找到相关文章

最新更新