我有以下代码,所有系统调用在运行时都成功:
#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/