函数fork()

时间:2018-11-29 00:17:18

标签: c fork posix

我有以下代码,所有系统调用均在运行时成功完成:

#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个参数,则该数字将是两倍。 这是正确的想法吗?

1 个答案:

答案 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