C 创建了多少个进程?
我认为这会创建5个流程,但我需要您的验证。 我对这种问题感到困惑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
#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;
}