进程控制小结

1.1   进程标识

1.1.1   相关函数

pid_t getpid(void);

pid_t getppid(void);

pid_t getuid(void);

pid_t geteuid(void);

pid_t getgid(void);

pid_t getegid(void);

1.1.2   说明

上面这些函数分别用于获得当前进程的:进程 ID 、父进程 ID 、实际用户 ID 、有效用户 ID 、实际组 ID 和有效组 ID

1.2   创建子进程

1.2.1   相关函数

pid_t fork(void);

pid_t vfork(void);

1.2.2   说明

除了 init 等系统进程以外,创建进程的唯一方法就是调用 fork 函数。调用 fork 后,子进程完全复制父进程。对子进程, fork 返回 0 ;对父进程, fork 返回子进程的 pid vfork 并不复制父进程的进程空间,在子进程调用 exec 或者 exit 之前,子进程在父进程的进程空间运行。

1.2.3   文件共享

子进程继承了父进程打开的文件描述符及其文件位移量,所以可能产生冲突,需要进行同步,也可以父进程等待子进程完成或者父、子进程执行不同的程序段以避免冲突。

1.2.4   fork 的用法

父进程希望复制自己,使父、子进程执行不同的代码段。

一个进程要调用一个不同的程序。

1.3   等待进程终止

1.3.1   相关函数

pid_t wait(int *status );

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

1.3.2   说明

status 返回所等待进程的返回状态,可以用一系列的宏来检查这个状态。

调用这两个函数后,当前进程可能会:

阻塞(如果其所以子进程都还在运行)

带子进程的终止状态立刻返回(如果一个子进程以终止,正在等待父进程存取其终止状态)

出错立刻返回(如果它没有任何子进程)

1.3.3   区别

在一个子进程终止前, wait 是其调用者阻塞,而 waitpid 有一选择项可以是调用者不阻塞。

waitpid 并不等待第一个终止的子进程,它有选择项可以控制它所等待的进程。

1.4   执行程序

1.4.1   相关函数

int  execve(const  char  *path ,  char  *const  argv [], char *const envp []);

int execl(const char *path ,const char *arg , ...);

int execlp(const char *file ,const char *arg , ...);

int  execle(const  char  *path ,  const  char  *arg   , ..., char * const envp []);

int execv(const char *path ,char *const argv []);

int execvp(const char *file ,char *const argv []);

1.4.2   区别

以上 6 个函数中 execve 时系统调用,其他的则是库函数。

根据函数名中的字符:

p 表示该函数取文件名作为参数,并用 PATH 环境变量寻找可执行文件。没有字符 p 则表示参数为完全路径名。

l 表示该函数取一个参数表,它和字符 v 互斥。 v 表示该函数取一个参数的数组 argv[]

e 表示该函数取 envp[] 数组作为新程序的环境变量表,没有 e 则使用当前进程的环境变量表。

1.5   设置用户 ID 和组 ID

1.5.1   相关函数

int setuid(uid_t uid );

int setgid(uid_t gid );

 

int seteuid(uid_t euid );

int setegid(gid_t egid );

 

int setreuid(uid_t ruid , uid_teuid );

int setregid(gid_t rgid , gid_tegid );

1.5.2   规则

关于用 setuid 函数改变用户 ID 的规则(也同样适用于 setgid 函数):

若进程具有 root 特权,则 setuid RUID EUID 以及 SUID 都设置为 uid

若进程没有 root 权限,但 uid 等于 RUID 或者 SUID ,则把 EUID 设置为 uid

上述条件都不满足,则返回出错, errno 设为 EPERM

1.6   执行 shell 程序

1.6.1   相关函数

int system(const char *cmd );

1.6.2   说明

相当于执行 /bin/sh –c cmd .

对于有 suid sgid 权限的程序不能使用此函数,会产生安全漏洞。

1.7   用户标识

1.7.1   相关函数

char *getlogin(void);

1.7.2   说明

得到运行该程序的用户的登录名。对于未连接到终端的进程,本函数会失败。

1.8   进程时间

1.8.1   相关函数

clock_t times(struct tms *buf);

1.8.2   说明

用于得到进程自己以及终止子进程的用户 CPU 时间和系统 CPU

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值