我有一个简单的管道程序,它创建子进程以便写入一些信息,父进程将显示此信息。
int main() {
int pfd[2], i, n;
pipe(pfd);
for(i=0; i<3; i++) {
if(fork() == 0) {
write(pfd[1], &i, sizeof(int));
close(pfd[0]); close(pfd[1]);
exit(0);
}
else {
}
}
for(i=0; i<3; i++) {
wait(0);
read(pfd[0], &n, sizeof(int));
printf("%d\n", n);
}
close(pfd[0]); close(pfd[1]);
return 0;
}
在这种情况下,父进程将收到以下结果:0 ,1 and 2
。
如果删除包含exit(0)
的行,如何找出程序创建的进程数?
提前致谢。
答案 0 :(得分:1)
下面是一个跟踪创建子项数的工作示例。请注意,fork()
将创建另一个地址空间,该空间不允许您在父/子之间共享变量。但程序计数器将保持不变,因此父母和孩子将在调用fork()
后立即执行。
如果你在一个循环中做fork()
,你的孩子将到达身体的末端,如果它通过了它将执行身体的条件(再次包括fork()
)。
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
int main() {
int pfd[2], i, n;
pid_t children_pids[3];
int children_created = 0;
memset(children_pids, 0, sizeof(children_pids));
pipe(pfd);
for(i=0; i<3; i++) {
pid_t p = fork();
if(p == 0) {
write(pfd[1], &i, sizeof(int));
close(pfd[0]); close(pfd[1]);
exit(0);
// break;
}
else {
children_pids[children_created++] = p;
}
}
for(i=0; i<3; i++) {
pid_t p = waitpid(children_pids[i], NULL, 0);
if (p == -1) {
/* error, but expected w/o exit() above */
continue;
}
read(pfd[0], &n, sizeof(int));
printf("%d\n", n);
}
close(pfd[0]); close(pfd[1]);
printf("Total children: %d\n", children_created);
return 0;
}