| nice(改变进程优先顺序) |
相关函数
| setpriority,getpriority
|
表头文件
| #include<unistd.h>
|
定义函数
| int nice(int inc);
|
函数说明
| nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。只有超级用户才能使用负的inc 值,代表优先顺序排在前面,进程执行会较快。
|
返回值
| 如果执行成功则返回0,否则返回-1,失败原因存于errno中。
|
错误代码
| EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。
|
|
| on_exit(设置程序正常结束前调用的函数) |
相关函数
| _exit,atexit,exit
|
表头文件
| #include<stdlib.h>
|
定义函数
| int on_exit(void (* function)(int, void*),void *arg);
|
函数说明
| on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。参数arg指针会传给参数function函数,详细情况请见范例。
|
返回值
| 如果执行成功则返回0,否则返回-1,失败原因存于errno中。
|
附加说明
|
|
范例
| #include<stdlib.h> void my_exit(int status,void *arg) { printf(“before exit()!/n”); printf(“exit (%d)/n”,status); printf(“arg = %s/n”,(char*)arg); } main() { char * str=”test”; on_exit(my_exit,(void *)str); exit(1234); }
|
执行
| before exit()! exit (1234) arg = test
|
|
| setpgid(设置进程组识别码) |
相关函数
| getpgid,setpgrp,getpgrp
|
表头文件
| #include<unistd.h>
|
定义函数
| int setpgid(pid_t pid,pid_t pgid);
|
函数说明
| setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。
|
返回值
| 执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
|
错误代码
| EINVAL 参数pgid小于0。 EPERM 进程权限不足,无法完成调用。 ESRCH 找不到符合参数pid指定的进程。
|
|
| setpgrp(设置进程组识别码) |
相关函数
| getpgid,setpgid,getpgrp
|
表头文件
| #include<unistd.h>
|
定义函数
| int setpgrp(void);
|
函数说明
| setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。
|
返回值
| 执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
|
|
| setpriority(设置程序进程执行优先权) |
相关函数
| getpriority,nice
|
表头文件
| #include<sys/time.h> #include<sys/resource.h>
|
定义函数
| int setpriority(int which,int who, int prio);
|
函数说明
| setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义 which who 代表的意义 PRIO_PROCESS who为进程识别码 PRIO_PGRP who 为进程的组识别码 PRIO_USER who为用户识别码 参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。
|
返回值
| 执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。 ESRCH 参数which或who 可能有错,而找不到符合的进程 EINVAL 参数which值错误。 EPERM 权限不够,无法完成设置 EACCES 一般用户无法降低优先权
|
|
| system(执行shell 命令) |
相关函数
| fork,execve,waitpid,popen
|
表头文件
| #include<stdlib.h>
|
定义函数
| int system(const char * string);
|
函数说明
| system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
|
返回值
| 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
|
附加说明
| 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。
|
范例
| #include<stdlib.h> main() { system(“ls -al /etc/passwd /etc/shadow”); }
|
执行
| -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd -r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
|
|
| wait(等待子进程中断或结束) |
相关函数
| waitpid,fork
|
表头文件
| #include<sys/types.h> #include<sys/wait.h>
|
定义函数
| pid_t wait (int * status);
|
函数说明
| wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
|
参数
| status可以设成NULL。子进程的结束状态值请参考waitpid()。
|
返回值
| 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
|
附加说明
|
|
范例
| #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> main() { pid_t pid; int status,i; if(fork()= =0){ printf(“This is the child process .pid =%d/n”,getpid()); exit(5); }else{ sleep(1); printf(“This is the parent process ,wait for child.../n”; pid=wait(&status); i=WEXITSTATUS(status); printf(“child’s pid =%d .exit status=^d/n”,pid,i); } }
|
执行
| This is the child process.pid=1501 This is the parent process .wait for child... child’s pid =1501,exit status =5
|
|
| waitpid(等待子进程中断或结束) |
相关函数
| wait,fork
|
表头文件
| #include<sys/types.h> #include<sys/wait.h>
|
定义函数
| pid_t waitpid(pid_t pid,int * status,int options);
|
函数说明
| 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 来判断后才使用此宏。
|
返回值
| 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
|
范例
| 参考wait()。
|