我正在做教科书“操作系统概念第七版”的练习,我有点困惑如何fork()
工作。据我了解,fork()
创建一个与其父进程同时运行的子进程。但是,我们如何确切地知道哪个进程首先运行呢?我的意思是执行顺序。
Problem
使用以下命令编写 C 程序fork()
在子进程中生成斐波那契数列的系统调用。序列号将在命令行中提供。
这是我的解决方案:
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void display_fibonacci_sequence( int n ) {
int i = 0;
int a = 1;
int b = 1;
int value;
printf( "%d, %d, ", a, b );
for( ;i < n - 2; ++i ) {
value = a + b;
printf( "%d, ", value );
a = b;
b = value;
}
printf( "\n" );
}
int main( int argc, char** argv ) {
int n;
pid_t pid;
pid = fork();
if( argc != 2 ) {
fprintf( stderr, "Invalid arguments" );
exit( -1 );
}
n = atoi( argv[1] );
if( pid < 0 ) {
fprintf( stderr, "Fork failed" );
exit( -1 );
}
else if( pid == 0 ) {
display_fibonacci_sequence( n );
}
else { // parent process
// what do we need to do here?
}
}
老实说,我看不出使用之间有什么区别fork
并且不使用fork
。此外,如果我想要parent处理来自用户的输入,并让child进程处理显示,我该怎么做?
您问了很多问题,我会尽力以方便的顺序回答它们。
第一个问题
老实说,我不认为使用 fork 和不使用 fork 有什么区别
使用叉子。
那是因为这个例子不是一个很好的例子。在您的示例中,父级没有执行任何操作,因此叉子毫无用处。
Second
else {
// what do we need to do here?
}
你需要wait(2)让孩子终止。请务必仔细阅读该页面。
Third
我希望父进程处理用户的输入,并让
子进程处理显示
读取分叉前的输入并“处理”里面的显示if (pid == 0)
Fourth
但是,我们如何确切地知道哪个进程首先运行呢?
很少有程序应该关心这个问题。你无法知道执行的顺序,它完全取决于环境。 TLPI 是这样说的:
在 fork() 之后,不确定是父进程还是子进程
子级——下一个可以访问CPU。在多处理器系统上,它们可以同时访问 CPU。
隐式或显式依赖于特定的应用程序
为了获得正确结果的执行顺序是开放
由于竞争条件而失败
也就是说,操作系统可以让您控制这个顺序。例如,Linux 有/proc/sys/kernel/sched_child_runs_first
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)