我有以下代码,所有系统调用均在运行时成功完成:
#include <unistd.h>
int main(int argc, char *argv[])
{
for (; argc > 1; argc--) {
if (0 == fork()) {
(void) fork();
}
}
}
我需要找出我将获得多少个子进程。 如果我应用一个参数,则fork()== 0中的fork()函数将生成一个父级和一个子进程,而(void)fork()相同=> 2个子进程 如果我应用2个参数,则该数字将是两倍。 这是正确的想法吗?
答案 0 :(得分:0)
使用以下代码:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
for (; argc > 1; argc--) {
if (0 == fork()) {
(void) fork();
}
puts( "mark" );
}
}
这是使用0、1、2个参数进行几次运行的结果
richard@richard-desktop:~/Documents/forum$ ./untitled2
richard@richard-desktop:~/Documents/forum$ ./untitled2 1
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ ./untitled2 1 2
mark
mark
mark
mark
mark
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ mark
mark
mark
mark
注意到“比赛”条件引起的问题吗?
解决竞争问题的一种方法是wait()
终止所有子进程,然后再启动另一组子进程
IE。
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
for (; argc > 1; argc--) {
if (0 == fork()) {
(void) fork();
}
puts( "mark" );
while( wait( NULL ) != -1 );
}
}
这将导致可读性强
richard@richard-desktop:~/Documents/forum$ ./untitled2
richard@richard-desktop:~/Documents/forum$ ./untitled2 1
mark
mark
mark
richard@richard-desktop:~/Documents/forum$ ./untitled2 1 2
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark