Cha*_*han 15 c fork scheduling
我正在练习教科书"操作系统概念第7版",我对如何fork()工作感到有些困惑.根据我的理解,fork()创建一个与其父项同时运行的子进程.但是,我们如何确切知道哪个进程首先运行?我的意思是执行的顺序.
问题
使用fork()在子进程中生成Fibonacci序列的系统调用编写C程序.序列号将在命令行中提供.
这是我的解决方案:
#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?
}
}
Run Code Online (Sandbox Code Playgroud)
说实话,我认为使用fork和不使用之间没有任何区别fork.此外,如果我希望父进程处理来自用户的输入,并让子进程处理显示,我该怎么办呢?
cni*_*tar 14
你问了很多问题,我会尝试以方便的顺序回答这些问题.
说实话,我认为使用fork和不使用fork之间没有任何区别.
那是因为这个例子不是很好.在您的示例中,父级不执行任何操作,因此fork无效.
else {
// what do we need to do here?
}
Run Code Online (Sandbox Code Playgroud)
您需要等待(2)让孩子终止.请务必仔细阅读该页面.
我希望父进程处理来自用户的输入,并让子进程处理显示
在fork之前读取输入并"处理"里面的显示 if (pid == 0)
但是,我们如何确切知道哪个进程首先运行?
很少有节目应该关注这一点.你无法知道执行的顺序,它完全取决于环境.TLPI说:
在fork()之后,不确定哪个进程 - 父进程或子进程可以访问CPU.在多处理器系统上,它们可以同时访问CPU.
为了获得正确的结果,隐式或明确依赖于特定执行顺序的应用程序可能会因竞争条件而失败
也就是说,操作系统可以允许您控制此订单.例如,Linux有/proc/sys/kernel/sched_child_runs_first.
我们不知道哪个先行,父母或孩子.这就是为什么父进程通常必须等待子进程完成,如果它们之间存在对执行顺序的依赖.
在您的具体问题中,没有任何特别的理由可以使用fork().你的教授可能只是为了一个微不足道的例子而给你这个.
如果您希望父级处理输入并计算要计算的子级,您所要做的就是将调用移动到fork()处理命令行参数的位置下方.使用与上面相同的基本逻辑,让孩子调用display_fibonacci_sequence,让父母等待
| 归档时间: |
|
| 查看次数: |
8875 次 |
| 最近记录: |