如何显示创建的进程数?
(不使用公式)
for (i=0; i<3; i++)
fork();
count = count + 1;
printf("%d",count);
答案 0 :(得分:3)
有很多方法可以做到这一点,一个好的技巧是让每个孩子将一个字节写入原始进程可以读取的文件描述符中。请注意,为简洁起见,以下代码绝对不包含错误检查。此外,我们仅报告生成进程的数量(7),而不是计算原始进程以获得8的计数:
int main(void) {
int fd[2];
int depth = 0; /* keep track of number of generations from original */
int i;
pipe(fd); /* create a pipe which will be inherited by all children */
for(i=0; i<3; i++) {
if(fork() == 0) { /* fork returns 0 in the child */
write(fd[1], &i, 1); /* write one byte into the pipe */
depth += 1;
}
}
close(fd[1]); /* exercise for the reader to learn why this is needed */
if( depth == 0 ) { /* original process */
i=0;
while(read(fd[0],&depth,1) != 0)
i += 1;
printf( "%d total processes spawned", i);
}
return 0;
}
答案 1 :(得分:1)
只打印一次计数值很容易。因为你可以在for循环之前获得进程pid。然后在for循环后再次获取pid,并且仅在pids匹配时打印。对于计数部分,它取决于您的孩子是否处理退出。如果他们退出解决方案更容易。如果子进程退出,下面的代码演示了一种可能的解决方案(为简洁起见未完成错误检查)。这个想法是每个子进程都计算自己的孩子。家长等待每个孩子完成并增加其计数。 Haven没有时间完全测试/调试程序,因此可能存在一些错误。但希望能给你一般的想法。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void)
{
pid_t before_pid, after_pid;
pid_t forked_pid;
int count;
int i;
int status;
before_pid = getpid();
count = 1; /* count self */
for (i = 0; i < 3; i++) {
forked_pid = fork();
if (forked_pid > 0) {
waitpid(forked_pid, &status, 0);
/* parent process - count child and descendents */
count += WEXITSTATUS(status);
} else {
/* Child process - init with self count */
count = 1;
}
}
after_pid = getpid();
if (after_pid == before_pid) {
printf("%d processes created\n", count);
}
return (count);
}