我正在修改操作系统考试,目前正试图理解这个过程问题:
int main()
{
int v=0;
if(fork())
{
v++;
if(!fork())
{
fork();
v--;
}
}
}
所以问题要求
绘制一棵树,反映上述程序运行时创建的进程的父子层次结构。
- 醇>
创建了多少个整数变量v的单独副本?在程序结束时讨论树中每个进程的v值是多少。
我遇到的主要问题是
if(fork())
代码中的行。通过查看其他堆栈溢出,我意识到了
if(fork()) = if(fork() != 0)
但是我仍然难以理解第一个if语句是否创建了子进程?因为那是第二种if语句的唯一方法:
(!fork())
可以执行吗?
这是我对目前对这个问题的理解有多远。 screenshot of attempt
希望图表清晰可辨!对于任何提示或指示,我都非常感激。
答案 0 :(得分:1)
请注意,if (fork()) /*etc*/
与
pid_t newtmp = fork();
if (newtmp != 0) /*etc*/
其中newtmp
是您的程序中未出现的新(变体)变量名称(您可以使用x1
,x2
等....前提是它在您的程序中没有出现),pid_t
是一种整数类型(可能是int
)。
使用显式和唯一名称重写您的代码后,fork
会给您更好的理解。
fork
时,您需要处理三个案例:
fork
失败(例如,因为您的系统内存不足,或者因为超出了某些限制)并且给出-1
fork
在孩子中成功,所以给出0
fork
在父级中成功,因此给出了孩子的pid。
但是当你编码if (fork())
时,你会忘记 - 或者错误地处理 - 第一种情况(失败)。它很少发生。
仔细阅读 (以及多次)fork(2)手册页。请注意,fork很难理解。
关于限制,请注意setrlimit(2)(以及内置的ulimit
bash。)
答案 1 :(得分:0)
答案是
if (fork ())
可能或可能决定是否创建了子进程。
转到手册页:
http://man7.org/linux/man-pages/man2/fork.2.html
我们发现fork()返回三种类型的值:
因此测试
if (fork ())
与
相同if(fork()!= 0)
无论是否创建了子进程,都可以成功。一个写得很好的问题会说
if (fork () > 0)
假设一切正常:
int main()
{
int v=0;
if(fork()) // Creates a child process that does nothing.
{
v++;
if(!fork()) // Creates a child process that creates a child process (that then does nothing but decrement v).
{
fork();
v--;
}
}
}