c - 函数 fork()

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

最佳答案

使用以下代码:

#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()让所有子进程终止

即:

#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

关于c - 函数 fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530057/

相关文章:

java - C++ 和 Java 中 CRC32 的不同结果

c - 我的 C 程序无法运行 `cannot execute binary file: Exec format error`

c - C语言的MasterMind游戏

c++ - fork 进程一直监听服务器的端口

shell - 防止 POSIX xargs 尝试运行空命令

c - 如何将外部类型的参数从 C 传递到 Fortran

c++ - 为什么 OSX 事件监视器不显示我启动的进程?

php - PHP 子进程是否使用相同的 Mysqli 连接池?

c - fork() 返回正数而不是零

cocoa - Cocoa 文件操作的线程语义是什么?例如NSData 读/写方法