操作系统进程相关:利用fork()系统调用创建进程。
问题描述
编制一段程序,使用系统调用fork( )创建两个子进程,这样在此程序运行时,系统中就有一个父进程和两个子进程在活动。每一个进程在屏幕上显示一个字符,父进程显示字符 A ,子进程分别显示 B 和 C 。试观察、记录并分析屏幕上进程调度的情况。
fork()函数
- 系统调用格式:
pid = fork();
, fork() 返回值:- =0:当前进程是子进程
- >0:当前进程是父进程,返回值为子进程的pid值
- -1:进程创建失败
- 如果 fork() 调用成功,它向父进程返回子进程的pid,并向子进程返回0,即 fork() 被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用 fork() 父进程的副本,称为子进程。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文,父进程与子进程并发执行。
代码实现
1 |
|
2 |
|
3 |
|
4 | |
5 | int main() { |
6 | pid_t pid1; |
7 | pid1 = fork(); |
8 | if(pid1 == -1) |
9 | perror("Fail to fork!\n"); |
10 | else if(pid1 == 0) |
11 | printf("B\tCurrent Process Pid: %d\tParent Process Pid: %d\n", getpid(), getppid()); |
12 | else { |
13 | pid_t pid2 = fork(); |
14 | if(pid2 == -1) |
15 | perror("Fail to fork!\n"); |
16 | if(pid2 == 0) |
17 | printf("C\tCurrent Process Pid: %d\tParent Process Pid: %d\n", getpid(), getppid()); |
18 | else { |
19 | wait(NULL); |
20 | printf("A\tCurrent Process Pid: %d\n", getpid()); |
21 | } |
22 | } |
23 | |
24 | return 0; |
25 | } |
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。