进程和程序

  • 程序:储存在外部存储的一个可执行文件
  • 进程:在内存中运行,处于执行期间的程序

进程和线程

  • 进程:是操作系统资源分配的基本单位,进程之间的地址空间和资源相互独立,一个进程至少有一个线程。
  • 线程:是处理器任务调度和执行的基本单位,同一进程的所有线程共享本进程的地址空间和资源。

进程ID

// 获取当前进程ID
pid_t getpid();

// 获取当前进程的父进程ID
pid_t getppid();

进程创建

fork() 函数

fork函数从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

#include <unistd.h>

pid_t fork();

进程调用fork后:

  • 分配新的内存块和内核数据结构给子进程。
  • 将父进程部分数据结构内容拷贝至子进程。
  • 添加子进程到系统进程列表当中。
  • fork返回,开始调度器调度。

fork函数时调用一次,返回两次。在父进程和子进程中各调用一次。子进程中返回值为0,父进程中返回值为子进程的PID。可以根据返回值的不同让父进程和子进程执行不同的代码。

vfork()函数

#include <unistd.h>

pid_t vfork();

fork创建子进程,把父进程数据空间、堆和栈复制一份;vfork创建子进程,与父进程内存数据共享

vfork先保证子进程先执行,当子进程调用exit()或者exec后,父进程才往下执行。

进程等待

wait()

// 暂停正在调用进程的执行,直到它的一个子进程终止。
// status:获取子进程退出状态,不关心则可以设置成为NULL。
// return:成功时返回终止子进程的进程ID,出错时返回-1。
pid_t wait(int *status);

waitpid()

// 暂停正在调用进程的执行,直到pid参数指定的子进程改变状态。
pid_t waitpid(pid_t pid, int *status, int options);

pid:

  • pid = -1,等待任意一个子进程,与wait等效。
  • pid > 0,等待其进程ID与pid相等的子进程,等待指定的子进程。

waitpid()默认仅等待终止的子进程,但可以通过options参数进行修改。 options:

  • 如果设为0:默认,是阻塞式等待,与 wait 等效。
  • 如果设为WNOHANG:是非阻塞等待。

进程终止

void exit(int status);

void _exit(int status);
  • exit:在进程退出的时候,会进行后续资源处理(比如刷新缓冲区)。
  • _exit:在进程退出的时候,不会进行后续资源处理,直接终止进程。

Linux 进程间通信

  • 管道
  • FIFO
  • 消息队列
  • 信号量
  • 共享内存区