C 创建了多少个进程?

C 创建了多少个进程?,c,process,operating-system,C,Process,Operating System,我认为这会创建5个流程,但我需要您的验证。 我对这种问题感到困惑 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { if (fork()){ printf("A\n"); exec("execjune"); } else{ printf("B\n

我认为这会创建5个流程,但我需要您的验证。 我对这种问题感到困惑

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    if (fork()){
        printf("A\n");
        exec("execjune");
    }
    else{
        printf("B\n");
        fork();
        fork();
        exec("execjune");
    }
    printf("D\n");

return 0;
}
#包括
#包括
#包括
int main()
{
if(fork()){
printf(“A\n”);
行政长官(“行政长官”);
}
否则{
printf(“B\n”);
fork();
fork();
行政长官(“行政长官”);
}
printf(“D\n”);
返回0;
}
将评论转换为答案


当你运行它时会发生什么?什么是
execjune
程序?没有名为
exec()
(标准名称都有1-3个后缀字母,例如
execve()
)的标准C或POSIX函数;
exec()
做什么

如果执行以下程序,并且如果执行
execjune
则执行
printf(“C\n”)
。我从我的教授那里得到了这个问题,所以我需要问有多少进程是用这些
fork()
语句创建的


在研究这样的代码行为时,我发现添加打印PID以及显著信息的
printf()
调用很有帮助。并调用
fflush()
,以确保按预期生成输出。创建一个函数来封装工作。在没有运行代码的情况下,假设
exec()
execve()
的一个变体,
execjune
打印“C”,我希望在输出中看到a、B和五个C,而不是D

为什么D是0?我认为D是通过
main()
方法打印的,还是

如果
exec()

下面是一些代码。即使在Linux(RHEL 7.4测试版)上,GCC 10.2.0的默认编译器选项下也没有函数
exec()
。因此,我创建了一个函数
exec()
,还有一个函数
dbg_print()
,并将它们与代码一起使用(源文件
fork97.c
编译为可执行文件
fork97
):

当我运行主程序时,我得到如下输出:

$fork97
28876:初步程序
28876:父进程
A.
28877:子进程
B
28877:在连续的fork()调用之间
28877:在连续的fork()调用之后
28879:在连续的fork()调用之后
28878:在连续的fork()调用之间
28878:在连续的fork()调用之后
28880:在连续的fork()调用之后
28876:C
28879:C
$28880:C
28878:C
28877:C
$

请注意,
28880
之前的提示
$
打印
C
是因为没有有效的方法来控制所有子进程在父进程退出之前退出(部分原因是子进程都执行
execjune
)。空白行和最终<代码> $<代码>提示来自于我在最后的C行之后回击。

为什么你认为这会产生5个过程?您对此有何疑问?这将取决于
execjune
的功能。运行它时会发生什么?什么是
execjune
程序?没有名为
exec()
(标准名称都有1-3个后缀字母,例如
execve()
)的标准C或POSIX函数;
exec()
做什么?在研究类似代码的行为时,我发现添加打印PID以及显著信息的
printf()
调用很有帮助。并调用
fflush()
,以确保按预期生成输出。创建一个函数来封装工作。在没有运行代码的情况下,假设
exec()
execve()
的一个变体,
execjune
打印“C”,我希望在输出中看到a、B和五个C,而不是D。如果
exec()
函数是
execve()
的变体(而不是
system()
的变体),然后,
if
else
块将显示的代码替换为
execjune
,并且没有打印D的代码路径。
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void dbg_print(const char *fmt, ...)
{
    printf("%d: ", (int)getpid());
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
    fflush(stdout);
}

static inline void exec(const char *cmd)
{
    execl(cmd, (char *)0);
}

int main(void)
{
    dbg_print("Initial process\n");
    if (fork()){
    dbg_print("Parent process\n");
        printf("A\n");
        exec("execjune");
    }
    else{
    dbg_print("Child process\n");
        printf("B\n");
        fork();
    dbg_print("Between consecutive fork() calls\n");
        fork();
    dbg_print("After consecutive fork() calls\n");
        exec("execjune");
    }
    printf("D\n");

    return 0;
}
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("%d: C\n", (int)getpid());
    return 0;
}