📒
Notes
  • 个人笔记
  • Machine Learning
    • Tensorflow
      • Text
        • Keras构建RNN
        • 字词嵌入
        • 字词嵌入示例程序
      • Data processing
        • tf.data数据加载
      • Tensorflow Tricks
    • 循环神经网络概览
    • Pix2Pix
  • Assembly Language
    • DOS中的Debug模式
    • LOOP指令
    • 8086CPU
    • 标志位寄存器
    • 汇编指令
    • 汇编语言源程序格式
  • Linux System
    • Systemctl 服务脚本
    • Linux端口占用
    • Btrfs文件系统
    • C Socket网络编程细节问题
  • Hexo
    • Hexo下的Tag/Categories栏
    • Git备份博客
    • Hexo博客基本部署
  • Kernel
    • C语言中消息队列实现
    • Linux内核的进程调度函数
    • Linux内核模块的编译
    • Linux Kernel概述
  • Linux Software
    • Linux软件安装与配置
  • Docker
    • OVS+Docker网络构建
    • Docker分层垃圾清理
  • C
    • CMakeList语法
Powered by GitBook
On this page
  • fork系统调用
  • wait系统调用
  • wait()
  • waitpid()
  • wait3()和wait4()
  • 信号量

Was this helpful?

  1. Kernel

Linux内核的进程调度函数

PreviousC语言中消息队列实现NextLinux内核模块的编译

Last updated 5 years ago

Was this helpful?

fork系统调用

Fork及其变种在类Unix系统中通常是创建新进程的唯一方式。 如果进程需要启动另一个程序的可执行文件,它需要先Fork来创建一个自身的副本。在fork之后,两个进程还运行着相同的程序,都像是调用了该系统调用一般恢复执行。然后它们可以检查调用的返回值确定其状态:是父进程还是子进程,以及据此行事。

fork的函数原型如下:

#include <sys/types.h>        // 提供类型 pid_t 的定义,之后示例中对其的引用也是同样的作用
#include <unistd.h>

pid_t fork(void);

返回值:成功调用fork时,父进程中的fork返回子进程的pid,子进程中则返回0,如果创建子进程失败返回-1。

wait系统调用

wait调用的一个意义在于获取子进程状态变更的相关信息,对于已经terminated的进程,调用wait可以使系统能够释放和进程相关的资源,否则进程会一直处于zombie状态。

wait()

wait()的原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

返回值:调用成功返回进程ID,失败返回-1。

在调用wait时,会暂停目前进程的执行,并开始分析当前进程中是否有子进程已经退出(进入僵死状态),如果有则会收集子进程的信息并将其销毁后返回,否则一直等待。 status参数是为了保存退出进程的状态,是指向int类型的指针。如果并不需要这一状态,可以传递NULL作为参数。

tait(&state);调用等效于waitpid(-1, &status, 0);。

waitpid()

waitpid在原本的wait基础上新增了两个参数,其原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid,int *status,int options);

参数

参数

使用

pid

等待的子进程的id。 pid < -1时等待绝对值相等的进程组中的所有进程。 pid = -1等待任何子进程,相当于wait(),事实上wait就是这么实现的。 pid = 0时,等待同一进程组中的所有子进程(进程组ID相同)。 pid > 0等待任何子进程id为pid的进程。

option

以一些额外的选项来控制waitpid,不使用则设为0。 WNOHANG如果没有任何已经结束的进程,则马上返回。 WUNTRACED如果子进程进入暂停执行的状态,则马上返回。

status

接收状态信息,储存在一个int类型的值中,不需要则设为NULL。

返回值

状态

返回值

正常返回

waitpid()收集到的子进程的pid。

设为WNOHANG并发现没有已退出的子进程

返回0。

调用出错

返回负值。

wait3()和wait4()

函数原型如下:

#include <sys/tpyes.h>
#include <sys/wait.h>

pid_t wait3(int *status,int options,struct rusage *rusage); 
pid_t wait4(pid_t pid,int *status,int options,struct rusage *rusage);

wait3()和wait4()除了可以活得子进程的状态信息外,还可以获得子进程的资源使用信息,通过参数rusage得到。其中wait3等待所有进程,wait4等待指定pid的进程。 据Linux man page,两个函数非标准因而不推荐使用。

信号量

C语言的信号量实现包含在semaphore.h中。 信号量使用类型为sem_t的变量,在使用之前需要对信号量进行初始化,并设置初始值。

初始化:使用sem_init();进行初始化,函数的定义如下:

int sem_init(sem_t *sem, int pshared, unsigned int value);

参数: sem:指定要初始化的信号量。 pshared:0表示应用于多线程,非0标识用于多线程。 value:指定信号量的初始值。

wait等待:使用sem_wait()时,信号量减一,当信号量为0是,函数阻塞。

int sem_wait(sem_t *sem);

参数即传入一个信号量sem。

trywait等待:使用sem_trywait()相比于sem_wait()在信号量为0的时候不会阻塞。

int sem_trywait(sem_t *sem);

如果无法完成自减操作,返回错误(被设置为EAGAIN)。

post增加:使用sem_post()时,信号量数值增加。

int sem_post(sem_t *sem);
Linux-kernel-process-scheduling-function_fork