Linux系统编程之一些函数用法

161 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

gdb调试

  • 设置父进程调试路径:set follow-fork-mode parent (默认)

  • 设置子进程调试路径:set follow-fork-mode child

exec函数族

使进程执行某一程序。成功无返回值,失败返回 -1

int execlp(const char *file, const char *arg, ...);		借助 PATH 环境变量找寻待执行程序

	参1: 程序名

	参2: argv0

	参3: argv1

	...: argvN

	哨兵:NULL

int execl(const char *path, const char *arg, ...);		自己指定待执行程序路径。

int execvp();

ps ajx --> pid ppid gid sid 

exec函数图示 exec函数.png

进程

  1. 孤儿进程:

    父进程先于子进终止,子进程沦为“孤儿进程”,会被 init 进程领养。

  2. 僵尸进程:

    子进程终止,父进程尚未对子进程进行回收,在此期间,子进程为“僵尸进程”。 kill 对其无效。

wait函数

回收子进程退出资源, 阻塞回收任意一个。

pid_t wait(int *status)

参数:(传出) 回收进程的状态。

返回值:成功: 回收进程的pid

	失败: -1, errno

函数作用1:	阻塞等待子进程退出

函数作用2:	清理子进程残留在内核的 pcb 资源

函数作用3:	通过传出参数,得到子进程结束状态


获取子进程正常终止值:

	WIFEXITED(status) --》 为真 --》调用 WEXITSTATUS(status) --》 得到 子进程 退出值。

获取导致子进程异常终止信号:

	WIFSIGNALED(status) --》 为真 --》调用 WTERMSIG(status) --》 得到 导致子进程异常终止的信号编号。

waitpid函数

指定某一个进程进行回收。可以设置非阻塞。

waitpid(-1, &status, 0) == wait(&status);

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

参数:
	pid:指定回收某一个子进程pid

		> 0: 待回收的子进程pid

		-1:任意子进程

		0:同组的子进程。

	status:(传出) 回收进程的状态。

	options:WNOHANG 指定回收方式为,非阻塞。

返回值:

	> 0 : 表成功回收的子进程 pid

	0 : 函数调用时, 参3 指定了WNOHANG, 并且,没有子进程结束。

	-1: 失败。errno
  • 总结:

    wait、waitpid 一次调用,回收一个子进程。

    想回收多个。while