进程基础

Linux进程相关shell指令

ps命令

ps-aux

free命令

free

top命令

top

kill命令

Linux进程操作

创建进程

system函数

fork函数

fork

exec函数族

退出进程

exit族函数

abort库函数

进程控制

wait函数

说明
WIFEXITED(wstatus)子进程正常退出的时候返回真,此时可以使用WEXITSTATUS(wstatus),获取子进程的返回情况
WIFSIGNALED(wstatus)子进程异常退出的时候返回真,此时可以使用 WTERMSIG(wstatus)获取信号编号,可以使用 WCOREDUMP(wstatus)获取是否产生core文件
WIFSTOPPED(wstatus)子进程暂停的时候返回真,此时可以使用WSTOPSIG(wstatus)获取信号编号
... 

waitpid函数

PID数值效果
pid > 0等待进程ID等于pid的子进程
pid = 0等待与调用进程同一进程组的任何子进程
pid = -1等待任何子进程
pid < -1等待进程组ID等于pid绝对值的任何子进程

options参数:

  1. waitpid是阻塞函数,如果给waitpid 的options参数设置一个名为WNOHANG的宏,则系统调用会变成非阻塞模式。

  2. 如果默认阻塞: 填0。

守护进程

进程组

会话

每个会话都有会话ID, 基本上会话ID都是最初创建会话的进程的PID。(man setsid)(man getsid)

  1. 可以使用getsid函数可以获取进程的会话ID。

  2. 一个进程可以使用系统调用setsid新建一个会话。该进程成为新会话的第一个进程/会话领导。

  3. 注意: 用来调用setsid创建会话的进程, 不能是进程组组长。

  4. 创建新会话以后,即使原来的shell被关闭了,子进程创建的新会话依然不受影响/不会关闭。

守护进程

守护进程的创建流程

  1. 父进程创建子进程,然后让父进程终止。

  2. 在子进程当中创建新会话。

  3. 修改当前工作目录为根目录。(因为如果使用当前目录, 意味着当前目录活跃, 则当前目录无法在文件系统中卸载; 而根目录所在的文件系统正常来讲是一直挂载的)

  4. 重设文件权限掩码为0,避免创建文件的权限受限。

  5. 关闭不需要的文件描述符,比如0、1、2。

日志

使用守护进程经常可以用记录日志, syslog函数 在Linux中可以用于发送消息到系统日志。(操作系统的日志文件存储在/var/log/...中) (man 3 syslog)

进程间通信

管道

有名管道

匿名管道

共享内存

System V

生产标识

ftok函数的作用是根据条件产生一个独特的、用于标识作用的键值,使得在SystemV共享内存机制中, 不同的进程可以通过同一键值访问到同一片共享内存,从而实现进程间通信。(man 2 ftok)

创建共享内存

使用shmget函数可以根据键来获取一个共享内存段。

  1. 函数的键值key通常由ftok函数生成。

  2. 如果参数key设置为IPC_PRIVATE的宏,函数总会创建一个新的共享内存段,且只有创建这个共享内存的进程,及其具有亲缘关系的进程(子进程)可以访问。 (设置IPC_PRIVATE创建的共享内存又被称为私有内存)

  3. 建议size为内存页大小的整数倍。

  4. shmflg参数, 可以设置共享内存的读写权限。 (Eg: 0600 ...)

  5. shmflg参数, 还可以配合逻辑标准使用。( IPC_CREAT、IPC_EXCL)

获取共享内存

shmat函数用于将共享内存段映射到当前进程的地址空间,允许进程访问共享内存段中的数据。(man 2 shmat)

共享内存通信

解除共享内存映射

使用 shmdt函数可以断开当前进程与共享内存段的连接,解除到共享内存段的映射(某种程度上等价于free)。

当一个进程通过 shmat函数将共享内存段附加到自己的地址空间后,使用 shmdt函数将其分离。 (man 2 shmdt)

信号

信号概念

在操作系统中, 信号用于通知进程----发生了某些事情。信号是一种进程间通信机制。

SignalValueActionComment
SIGHUP1Term链接断开
SIGINT2Term键盘中断(Ctrl+C触发) (默认行为:终止进程)
SIGQUIT3Core键盘退出(Ctrl+\触发) (默认行为:终止进程)
SIGILL4CoreCPU指令译码阶段无法识别
SIGABRT6Core异常终止
SIGFPE8Core浮点异常
SIGKILL9Term终止进程
SIGSEGV11Core异常内存访问
SIGPIPE13Term写入无读端的管道
SIGALRM14Term定时器超时
SIGTERM15Term终止
SIGUSR130, 10, 16Term自定义信号1
SIGUSR231, 12, 17Term自定义信号2
SIGCHLD20, 17, 18Ign子进程终止或者暂停
SIGCONT19, 18, 25Cont暂停后恢复运行
SIGSTOP17, 19, 23Stop暂停进程(可通过Ctrl+Z触发)(SIGCONT或者fg恢复)
SIGTSTP18, 20, 24Stop终端输入的暂停
SIGTTIN21, 22, 26Stop后台进程控制终端读
SIGTTOU22, 22, 27Stop后台进程控制终端写

信号和函数

signal

进程对信号有三种处理方式。

  1. 如果我们未进行任何设置和操作,信号具有预设的处理机制, 将按照预设的处理机制执行。(操作系统控制/预设的)

  2. 我们也可以选择设置忽略一个信号。(signal(信号, SIG_IGN)) (并不是每一个信号都是可以被忽略的)

  3. 设置信号为其默认行为SIG_DFL (signal(信号, SIG_DFL))

kill

alarm

setitimer

which参数:指定定时器的类型。常用的类型包括:

  1. ITIMER_REAL:按照真实时间,当时间到达,发出一个 SIGALRM信号。

  2. ITIMER_VIRTUAL:按照用户态代码执行时间计算,当时间到达,发出一个SIGVTALRM信号。

  3. ITIMER_PROF:按照用户态用户态和内核态代码执行时间计算,当时间到达,发出一个SIGPROF信号。