1. 编写一C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。 2. 多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。记下这种情况,试简单分析其原因。 3. 修改程序,在父、子进程中分别使用wait()、exit()等系统调用“实现”其同步推进,并获取子进程的ID号及结束状态值。多次反复运行改进后的程序,观察并记录运行结果。
时间: 2024-02-28 18:54:42 浏览: 124
举例讲解C语言的fork()函数创建子进程的用法
以下是一个简单的实现:
```c
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
int main(){
pid_t pid1,pid2;
printf("I am father\n");
pid1 = fork();
if(pid1==0){
printf("I am son\n");
_exit(0);
}
else{
pid2 = fork();
if(pid2==0){
printf("I am daughter\n");
_exit(0);
}
else{
wait(NULL);
wait(NULL);
}
}
return 0;
}
```
在程序运行时,通过系统调用fork()创建两个子进程,使父、子三进程并发执行。父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。
通过多次运行程序,我们可以发现屏幕显示结果的顺序并不是固定的。这是因为程序中的三个进程是并发执行的,操作系统会根据进程调度算法来安排它们的执行顺序,所以每次运行的结果可能都不同。
为了实现进程的同步推进,我们在父、子进程中分别使用了wait()和_exit()等系统调用。父进程通过两次调用wait()来等待子进程结束并获取它们的结束状态值。子进程在执行完它们的任务后,通过调用_exit()来退出进程,而不是使用return。这是因为在子进程中使用return会同时返回到父进程中,而不是退出子进程。
通过多次运行改进后的程序,我们可以发现它们的运行结果是固定的,因为父、子进程之间的同步机制保证了它们的执行顺序。
阅读全文