编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“f”,两个子进程分别显示字符“s” 和“d”。多次运行可执行程序,观察记录屏幕上的显示结果,并分析原因。画出进程树的结构图。
时间: 2024-09-16 09:04:42 浏览: 77
在Unix/Linux环境中,你可以编写如下的C语言程序来实现这个需求,使用`fork()`函数创建子进程并控制它们各自的行为:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define STRING_TO_DISPLAY "fsd"
int main() {
pid_t child_pid;
printf("Parent process: %d\n", getpid());
// 创建第一个子进程
if ((child_pid = fork()) > 0) { // 父进程
printf("Child 1 (pid: %d) started.\n", child_pid);
char* str[] = STRING_TO_DISPLAY;
wait(NULL); // 等待子进程结束
} else { // 子进程1
char* ch = str[0]; // 获取第一个字符 'f'
printf("Child 1 (pid: %d) displays: %c\n", getpid(), ch);
exit(0); // 结束进程
}
// 创建第二个子进程
if ((child_pid = fork()) > 0) { // 父进程
printf("Child 2 (pid: %d) started.\n", child_pid);
char* str[] = STRING_TODISPLAY + 1; // 指向第二个字符 's'
wait(NULL); // 等待子进程结束
} else { // 子进程2
char* ch = str[0]; // 获取第二个字符 's'
printf("Child 2 (pid: %d) displays: %c\n", getpid(), ch);
exit(0); // 结束进程
}
// 如果这里没有返回,那么父进程就是main进程,它会直接退出
return 0;
}
```
当你运行这个程序时,你会看到屏幕上交替显示"Parent process:", "Child 1 displays: f", "Child 2 displays: s", 然后是 "Child 1 displays: d",最后"Child 2 displays: d"。这是因为`wait()`函数使得父进程等待一个子进程结束后继续执行。
至于进程树的结构图,通常呈现为主进程(PID 1)通过两次`fork()`生成两个子进程(PID 2 和 PID 3),然后子进程各自再没有新的分支。当所有子进程都执行完后,主进程结束。
阅读全文