利用fork()系统调用创建进程

操作系统进程相关:利用fork()系统调用创建进程。

问题描述

编制一段程序,使用系统调用fork( )创建两个子进程,这样在此程序运行时,系统中就有一个父进程和两个子进程在活动。每一个进程在屏幕上显示一个字符,父进程显示字符 A ,子进程分别显示 B 和 C 。试观察、记录并分析屏幕上进程调度的情况。

fork()函数

  1. 系统调用格式:pid = fork(); , fork() 返回值:
    • =0:当前进程是子进程
    • >0:当前进程是父进程,返回值为子进程的pid值
    • -1:进程创建失败
  2. 如果 fork() 调用成功,它向父进程返回子进程的pid,并向子进程返回0,即 fork() 被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用 fork() 父进程的副本,称为子进程。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文,父进程与子进程并发执行。

代码实现

1
#include <unistd.h>
2
#include <stdio.h>
3
#include <stdlib.h>
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获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。