linux下进程相关操作
进程标志符:进程ID,内核分配,该标志符非负,范围0~32767
父进程和父进程ID(PPID)
启动进程的用户ID(UID)和所归属的组(GID);
进程的有效用户ID和有效组ID
进程的进程组ID:一个进程可以属于某一个进程组。
进程的会话ID:每一个进程都属于惟一的会话。
进程状态:状态分为运行R、休眠S、阻塞Z;
进程执行的优先级;
进程资源占用:比如占用资源大小(内存、CPU占用量);
getpid(void) 获取当前进程ID
getppid(void) 获取当前进程的父进程ID
getpgrp(void) 获取当前进程的进程组ID
getpgid(pid_t pid) 获取进程组ID
geteuid(void) 获取当前进程的有效用户ID
getgid(void) 获取当前进程的用户组ID
getegid(void) 获取当前进程的有效用户组ID
getsid(pid_t pid) 获取当前进程的会话ID
setpgid()将参数pid 指定进程所属的组ID设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组ID,如果参数pgid为0,则会以
目前进程的进程ID来取代。
int setpgrp(void)
setpgrp()将目前进程所属的组ID设为目前进程的进程ID。此函数相当于调用setpgid(0,0)。
pid_t setsid(void)
int setuid(uid_t uid) 设置进程的用户ID
int setreuid(uid_t ruid, uid_t euid) 将进程的实际用户ID设置为ruid,有效用户ID设置为euid
int seteuid(uid_t uid) 设置进程的有效用户ID为uid
int setgid(gid_t gid) 设置进程的组ID
int setregid(gid_t rgid, gid_t egid) 将进程的实际组ID设置为rgid,有效组ID设置为egid
int setegid(gid_t gid) 设置进程的有效组ID
Linux用nice系统调用来修改进程的优先级,默认情况下,进程的优先级为0,系统允许的优先级的 范围为:-20~2
int nice(int inc)
nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。 只有超级用户才能使用负的inc值,代表优先顺序排在前面,进程执行会较快。返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中。错误代码 EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。 nice系统调用只能用于修改进程自身的优先级。
setpriority(设置程序进程执行优先权)
函数说明 setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,
PRIO_PGRP who为进程的组ID
PRIO_USER who为用户ID
参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。
此优先权默认是0,而只有超级用户(root)允许降低此值。返回值 执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。 ESRCH 参数which或who 可能有错,而找不到符合的进程EINVAL 参数which值错误。EPERM 权限不够,无法完成设置 EACCES
一般用户无法降低优先权
函数说明 getpriority()可用来取得进程、进程组和用户的进程执行优先权。 参数 which有三种数值,参数who 则依which值有不同定义
which who 代表的意义
PRIO_PGRP who 为进程的组ID
PRIO_USER who 为用户ID
此函数返回的数值介于-20 至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。 返回值 返回进程执行优先权,如有错误发生返回值则为-1 且错误原因存于errno。附加说明 由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最好在调用次函数前先清除errno变量。错误代码 ESRCH 参数which或who 可能有错,而找不到符合的进程。EINVAL 参数which 值错误。
函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。
fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。
注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
1) fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec和exit之前,子进程与父进程共享数据段
2) fork不对父子进程的执行次序进行任何限制;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父子进程的执行次序才不再有限制
函数说明:wait()函数的工作过程是:先判断子进程是否存在,即是否成功创建了一个子进程。如果创建失败,则会直接退出并提示相关错误信息,并返回-1;如果创建成功,wait()将父进程挂起,直到子进程结束,并返回子进程结束时的状态和PID。
如果不在意结束状态值,则参数status 可以设成NULL。
返回值:如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
函数说明: waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。参数pid 为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid 的子进程。
参数option 可以为0 或下面的OR 组合:
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真。
WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。
1、管道(pipe)和有名管道(FIFO)
4)有名管道创建
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname,mode_t mode);
返回:若成功则为0,若出错返回-1
一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(close,read,write,unlink等)都可用于FIFO。当打开一个FIFO时,非阻塞标(O_NONBLOCK)产生下列影响:
A、在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。
B、如果指一了O_NONBLOCK,则只读打开立即返回。但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。
FIFO相关出错信息:EACCES(无存取权限)EEXIST(指定文件不存在)
ENAMETOOLONG(路径名太长)
ENOENT(包含的目录不存在)
ENOSPC(文件系统余空间不足)
ENOTDIR(文件路径无效)
EROFS(指定的文件存在于只读文件系统中)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。