文章目录
Introduction
本文主要讨论在UNIX系统如何通过一系列系统调用函数创建与控制进程,创建进程时用到的系统调用函数主要有:fork()、exec()、wait()等,控制进程用到的系统调用函数主要有:kill()等。下面结合代码详细介绍上述系统调用函数功能。
一、创建进程
fork()可用于创建一个新的进程,更确切的说,它主要是用于在父进程中创建一个子进程,当调用此函数时,操作系统会为子进程分配其自己的地址空间、寄存器、PC等,子进程运行的代码是父进程代码的复制,但是执行不是从main函数开始,而是从fork()被调用的那行代码开始。fork()的返回值在父进程和子进程中也不一样,父进程中fork()的返回值为子进程的PID,而子进程中fork()的返回值为0.
当调用fork()函数时,因为CPU调度器的复杂性,父进程和子进程的执行顺序其实是不确定的,此时可以使用wait()函数来控制两个进程的执行,使其执行顺序由不确定变为确定。调用wait()函数可以使执行延迟,直到子进程完成执行。
除此之外,上面有提到fork()创建的子进程执行的代码是父进程的复制,如果要运行另一个程序可以调用exec()函数,当进程调用exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的main函数开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。使用上述fork()、wait()、exec()函数创建进程的实例代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])