Linux_进程控制

fork

#include <unistd.h>

pid_t fork(void);
//返回值:子进程返回0,父进程返回子进程ID;若出错返回-1

pid_t getpid();
//获得子进程ID

pid_t getppid();
//获得父进程ID

注意
fork之后,父子进程交替运行。
写时拷贝。
进程被虚拟成文件: /prev/pid/

ps 查看进程状态

ps aux
ps -ef

终止进程

ctrl + c
kill -9 pid kill不能终止僵死进程

终止
5个正常终止条件
(1)在main函数内执行return语句,等效于调用exit。
(2)调用exit函数。此函数由ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流等。因为ISO C不处理文件描述符、多进程以及作业控制,这对UNIX系统而言是不完整的。
(3)调用_exit或_Exit函数。ISO C定义_Exit,其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O流是否冲洗,这取决于实现。在UNIX系统中_Exit和_exit同义。_exit函数由exit函数调用,处理UNIX系统特定的细节。_exit由POSIX.1说明。
(4)进程的最后一个线程在其启动例程中执行return语句。但是该线程的返回值不作用进程的返回值。进程以终止状态0返回。
(5)进程的最后一个线程调用pthread_exit函数。

3个异常终止条件
(1)调用abort。它产生SIGABRT信号,这是下一个异常终止的特例。
(2)当进程接收到某种信号时。信号可由进程自身(如调用abort函数)、其他进程或内核产生。例如,若进程引用地址空间之外的储存单元、或者除以0,内核就会为该进程产生相应的信号。
(3)最后一个线程对“取消(cancellation)”请求做出响应。默认情况下,“取消”以延迟方式产生:一个线程要求取消另一个线程,若干时间后,目标线程终止。

不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的储存器等。

#include <stdlib.h>

int atexit(void (*func)(void));
//返回值:若成功返回0;若失败返回非0

等待

#include <sys/wait.h>

pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
//两个函数返回值,若成功返回进程ID;若失败返回0或-1

区别:
(1)在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
(2)waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以Jon告知它所等待的进程。

扫描二维码关注公众号,回复: 1061737 查看本文章

waitpid函数中pid参数的作用

pid > 0 : 等待进程id等于pid的子进程死亡
pid = 0 : 调用者进程所在进程组的任何一个子进程死亡
pid = -1: 等待任何一个子进程死亡
pid < -1: |pid|进程组的任何一个子进程死亡

waitpid函数中options参数的作用

0
WNOHANG 若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时返回值为0
WCONTINUED 若实现支持作业控制,由pid指定的任一子进程在停止后已经继续,但其状态尚未报告,则返回其状态(POSIX.1的XSI扩展)
WUNTRACED 若某实现支持作业控制,而由pid指定的任一子进程已处于停止状态,并且其状态自停止以来还未报告过,则返回其状态。WIFSTOPPED宏确定返回值是否对应于一个停止的子进程。

statloc
两个函数的参数statloc是一个整型指针,如果不是空指针,则终止进程的终止状态保存在该指针指向的单元内。如果不关心终止状态可以指定为空指针。
宏: WIFSIGNALED(status) ————如果被信号打断退出,返回真
WIFEXITED(status) ————如果正常退出,返回真
WTERMSIG(status) ————如果被信号打断,返回信号值
WEXITSTATUS(status) ————如果正常退出,得到退出码

猜你喜欢

转载自blog.csdn.net/cute_shuai/article/details/80164874