进程控制小结

来源:互联网 发布:关于大数据的股票 编辑:程序博客网 时间:2024/05/29 18:17
Linux下的进程控制小结

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返回子进程的pidvfork并不复制父进程的进程空间,在子进程调用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特权,则setuidRUIDEUID以及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.

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

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