【问题标题】:Function fork()函数 fork()
【发布时间】:2019-04-30 23:41:39
【问题描述】:

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

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

【问题讨论】:

  • 这样做的目的是什么?
  • 试一试并告诉我们答案 - pid 的 printf 会很有用
  • 找出我将获得多少子进程。否则只是一个程序
  • 最简单的方法是在 main() 的末尾加上 puts("Malk"); 并以 ./foo | wc -l 开头

标签: c fork posix


【解决方案1】:

使用以下代码:

#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() 让所有子进程在启动另一组子进程之前终止

I.E.

#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

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2014-05-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多