Linux进程相关函数

本文详细介绍了Linux操作系统中的关键进程管理函数,包括fork用于创建子进程,getpid获取进程ID,getuid和getgid获取用户和组ID,exec族函数用于执行新程序,以及wait函数等待子进程结束。这些函数构成了Linux进程操作的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程相关函数(进程原语)

1.fork

	#include <unistd.h>
	
	pid_t fork(void);            pid_t     可以看做无符号整形
	#include <sys/types.h>
	#include <unistd.h>
	
	id_t vfork(void);
	成功时,子进程的PID在父进程中返回,子进程中返回0,若失败在父进程中返回 -1,不创建子进程,并且设置errno
	由于fork函数有一次调用两次返回的特点,可以利用返回值的不同,使父子进程分别实现不同的功能
	在创建子进程时,父进程的所有代码通过映射的方式与子进程共享,只有在子进程进行数据写入时才
	会真正为子进程复制,也称"读时共享,写时复制",这样节省了内存空间也减少了复制开销
	
	vfork: 子进程先运行,父进程等到子进程退出或者程序替换后,父进程才会运行,否则同时运行,因为父子进程共用虚拟地址空间,会造成调用栈混乱,因此阻塞父进程,vfork子进程如果return退出,释放资源会使父进程陷入混乱或错误

2.getpid

	#include <sys/types.h>
	#include <unistd.h>
	
	pid_t getpid(void);       //返回调用进程的进程ID。(这通常用于生成唯一临时的例程文件名)
	pid_t getppid(void);      //返回调用进程的父进程的进程ID

3.getuid

	#include <unistd.h>
	#include <sys/types.h>
	
	uid_t getuid(void);       //返回实际用户id
	uid_t geteuid(void);      //返回有效用户id

4.getgid

	#include <unistd.h>
	#include <sys/types.h>
	
	gid_t getgid(void);       //返回实际用户组id
	gid_t getegid(void);      //返回有效用户组id

5.exec 族

	#include <unistd.h>
	
	extern char **environ;
	
	//在当前路径下找path, 命令, 命令参数, NULL
	int execl( const char *path, const char *arg, ...);
	
	//在path环境变量里找file, 命令, 命令参数, NULL
	int execlp( const char *file, const char *arg, ...);
	
	//在当前路径下找path, 命令, 命令参数, NULL, envp[] = {环境变量}
	int execle( const char *path, const char *arg , ..., char * const envp[]);
	
	//在当前路径下找path, argv[] = {命令, 命令参数..., NULL}
	int execv( const char *path, char *const argv[]);
	
	//在path环境变量里找file, argv[] = {命令, 命令参数..., NULL}
	int execvp( const char *file, char *const argv[]);
	
	//在设置的环境变量里找filename, 命令, 命令参数, NULL, envp[] = {环境变量}
	int execve (const char *filename, char *const argv [], char *const envp[]);
	
	函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果失败则返回-1
	上,只有execve是真正的系统调用,以上五个函数最终都调用execve,所以execve函数在man手册第2节
	其他的函数在man手册第3节
	exec函数,第一个参数必须是有效的路径,那么第二个参数就相当于一个占位符,没有意义,但不能删除,第三个参数才是函数真正关心的

6.wait

	#include <sys/types.h>
	#include <sys/wait.h>
	
	pid_t wait(int *status);
	pid_t waitpid(pid_t pid, int *status, int options);
	int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
	wait是一个阻塞函数, 调用wait的父进程会一直等待回收子进程资源,如果没有子进程,wait返回-1,之后才会向下执行
	wait如果成功返回死亡的子进程的id号,失败返回-1
	
	waitpid是阻塞函数但可以设置为非阻塞, pid设置回收范围, status接受退出值, options选项
	waitpid如果成功,返回状态发生改变的子进程id,如果设定了WNOHANG并且有一个或多个进程被指定了pid的回收,但是状态没有改变则返回0
	失败返回-1
		pid的值为:
		< -1					回收指定进程组内的任意子进程
		-1						可以回收任何子进程
		0						回收和当前调用waitpid一个组的所有子进程
		> 0					回收子进程,该子进程的pid是你所设置的pid。
	option的值是以下常数的一个或一个或多个:
	WNOHANG			如果没有子进程结束,立即返回,非阻塞
	WUNTRACED		如果子进程已经停止,则返回
	WCONTINUED		如果通过交付SIGCONT恢复了已停止的子进程,则返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值