linux 进程常用操作

常用操作

  1. 获取和设置进程标识
  2. 创建一个子进程
  3. 清理退出的子进程资源
  4. 执行一个新程序

对应函数

获取和设置进程标识

设置进程用户ID或组ID时,只能由特权用户权限向非特权用户权限进行设置。一般用于限制用户的操作权限。

  1. 获取进程号
//获取本进程号
pid_t getpid(void);
//获取父进程号
pid_t getppid(void);
  1. 获取进程标识
//获取进程实际用户ID
uid_t getuid(void);
//获取有效用户ID
uid_t geteuid(void);

//获取进程实际组ID
gid_t getgid(void);
//获取进程有效组ID
gid_t getegid(void);
  1. 设置进程标识
//设置进程实际用户ID
int setuid(uid_t uid);
//设置进程实际组ID
int setgid(gid_t gid);

//设置进程有效用户用户ID
int seteuid(uid);
//设进程有效用户组ID
int setegid(gid_t gid);

//交换实际用户ID与有效用户ID的值

int setreuid(uid_t ruid, uid_t euid);
int setregid(gid_t rgid, gid_t egid);

创建一个子进程

  1. 创建子进程函数
pid_t fork(void);
pid_t vfork(void);
		返回 0的是子进程;
		返回 >0 的是父进程,返回值是子进程pid
		返回 <0 表示执行失败
	
	创建新进程的目的是为了执行另一个程序,所以会很快调用exec系列(下文介绍)的函数。如果是执行相关联的任务一般是创建线程(以后的文章会写到)。
	
这两个函数的区别:
	1. fork创建子进程后不确定父进程和子进程那个先运行。
	2. vfork创建子进程后确定让子进程先运行,当子进程之后execl后父进程再开始运行。
  1. 子进程从父进程复制的内容

    a. 实际用户ID,实际组ID,有效用户ID,有效组ID,
    b. 附属组,进程组ID,会话ID
    c. 控制终端,当前工作目录,根目录,
    d. 信号屏蔽和信号处理函数
    e. 文件描述符,环境变量
    f. 资源限制

  2. 子进程与父进程不同的标识

    a. 进程ID
    b. 文件锁
    c. 未处理闹钟被清除
    d. 未处理信号集设置为空

清理退出的子进程资源

  1. wait
pid_t wait(int *status);
	成功:返回终止进程pid; 失败:返回-1

执行wait()函数后,程序会一直阻塞等待一个子进程的状态改变。

  1. waitpid
pid_t waitpid(pid_t pid, int *status, int option);
	成功:返回终止进程pid;失败:返回-1;option为WNOHANG时可返回0

参数 pid:
	pid == -1 	等待任意子进程,与wait一致
	pid > 0		等待进程ID为pid的子进程
	pid == 0  	等待进程组ID的任意子进程
	pid < 0		等待组ID为pid的绝对值的任意子进程
参数 option:
	WNOHANG		不阻塞,未收到子进程的终止状态返回0
	0			不设置
  1. 进程终止状态操作宏
WIFEXETED(status)	正常终止则为真
	WEXETSTATUS(status)		获取进程退出返回参数的低8WIFSIGNALED(status)	被信号终止则为真
	WTERMSIG(status)	获取终止进程的信号的编号
	WCOREDUMP(status)	终止进程已产生core文件则为真

WIFSTOPED(status)	子进程暂停则为真
	WSTOPDIG(status)	获取使进程暂停的信号的编号

WIFCONTINUED(status)	子进程继续运行则为真

执行一个新程序

  1. 函数
extern char **environ;

int execl(const char *path, const char *arg, ... /* (char  *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);
int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

  1. 新程序继承原来程序的资源

a. 进程ID和父进程ID
b. 附属组ID,进程组ID,会话ID
c. 控制终端,根目录,当前工作目录
d. 闹钟,信号屏蔽,未处理信号
e. 文件锁,
f. 资源限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>