Linux 常用C函数(进程操作篇2)

news/2024/7/11 1:02:04 标签: linux, c, system, string, function, null
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
class="tit"> Linux 常用C函数(进程操作篇2)
class="date"> 2007-03-22 11:31
class="cnt">
ce="宋体" size="2">
ce="宋体" size="2">
nice(改变进程优先顺序)
ce="宋体" size="2">相关函数
ce="宋体" size="2">setpriority࿰c;getpriority
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<unistd.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int nice(int inc);
ce="宋体" size="2">函数说明
ce="宋体" size="2">nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面࿰c;即表示进程执行会越慢。只有超级用户才能使用负的inc 值࿰c;代表优先顺序排在前面࿰c;进程执行会较快。
ce="宋体" size="2">返回值
ce="宋体" size="2">如果执行成功则返回0࿰c;否则返回-1࿰c;失败原因存于errno中。
ce="宋体" size="2">错误代码
ce="宋体" size="2">EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc191">
ce="宋体" size="2">
ce="宋体" size="2">
on_exit(设置程序正常结束前调用的函数)
ce="宋体" size="2">相关函数
ce="宋体" size="2">_exit࿰c;atexit࿰c;exit
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<stdlib.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int on_exit(void (* function)(int, void*),void *arg);
ce="宋体" size="2">函数说明
ce="宋体" size="2">on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时࿰c;参数function所指定的函数会先被调用࿰c;然后才真正由exit()结束程序。参数arg指针会传给参数function函数࿰c;详细情况请见范例。
ce="宋体" size="2">返回值
ce="宋体" size="2">如果执行成功则返回0࿰c;否则返回-1࿰c;失败原因存于errno中。
ce="宋体" size="2">附加说明
ce="宋体" size="2">
ce="宋体" size="2">范例
ce="宋体" size="2">#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);
}
ce="宋体" size="2">执行
ce="宋体" size="2">before exit()!
exit (1234)
arg = test
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc192">
ce="宋体" size="2">
ce="宋体" size="2">
setpgid(设置进程组识别码)
ce="宋体" size="2">相关函数
ce="宋体" size="2">getpgid࿰c;setpgrp࿰c;getpgrp
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<unistd.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int setpgid(pid_t pid,pid_t pgid);
ce="宋体" size="2">函数说明
ce="宋体" size="2">setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0࿰c;则会用来设置目前进程的组识别码࿰c;如果参数pgid为0࿰c;则会以目前进程的进程识别码来取代。
ce="宋体" size="2">返回值
ce="宋体" size="2">执行成功则返回组识别码࿰c;如果有错误则返回-1࿰c;错误原因存于errno中。
ce="宋体" size="2">错误代码
ce="宋体" size="2">EINVAL 参数pgid小于0。
EPERM 进程权限不足࿰c;无法完成调用。
ESRCH 找不到符合参数pid指定的进程。
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc193">
ce="宋体" size="2">
ce="宋体" size="2">
setpgrp(设置进程组识别码)
ce="宋体" size="2">相关函数
ce="宋体" size="2">getpgid࿰c;setpgid࿰c;getpgrp
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<unistd.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int setpgrp(void);
ce="宋体" size="2">函数说明
ce="宋体" size="2">setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。
ce="宋体" size="2">返回值
ce="宋体" size="2">执行成功则返回组识别码࿰c;如果有错误则返回-1࿰c;错误原因存于errno中。
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc194">
ce="宋体" size="2">
ce="宋体" size="2">
setpriority(设置程序进程执行优先权)
ce="宋体" size="2">相关函数
ce="宋体" size="2">getpriority࿰c;nice
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<sys/time.h>
#include<sys/resource.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int setpriority(int which,int who, int prio);
ce="宋体" size="2">函数说明
ce="宋体" size="2">setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值࿰c;参数who 则依which值有不同定义
which who 代表的意义
PRIO_PROCESS who为进程识别码
PRIO_PGRP who 为进程的组识别码
PRIO_USER who为用户识别码
参数prio介于-20 至20 之间。代表进程执行优先权࿰c;数值越低代表有较高的优先次序࿰c;执行会较频繁。此优先权默认是0࿰c;而只有超级用户(root)允许降低此值。
ce="宋体" size="2">返回值
ce="宋体" size="2">执行成功则返回0࿰c;如果有错误发生返回值则为-1࿰c;错误原因存于errno。
ESRCH 参数which或who 可能有错࿰c;而找不到符合的进程
EINVAL 参数which值错误。
EPERM 权限不够࿰c;无法完成设置
EACCES 一般用户无法降低优先权
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc195">
ce="宋体" size="2">
ce="宋体" size="2">
system(执行shell 命令)
ce="宋体" size="2">相关函数
ce="宋体" size="2">fork࿰c;execve࿰c;waitpid࿰c;popen
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<stdlib.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">int system(const char * string);
ce="宋体" size="2">函数说明
ce="宋体" size="2">system()会调用fork()产生子进程࿰c;由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令࿰c;此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置࿰c;SIGINT和SIGQUIT 信号则会被忽略。
ce="宋体" size="2">返回值
ce="宋体" size="2">如果system()在调用/bin/sh时失败则返回127࿰c;其他失败原因返回-1。若参数string为空指针(NULL)࿰c;则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值࿰c;但是此返回值也有可能为system()调用/bin/sh失败所返回的127࿰c;因此最好能再检查errno 来确认执行成功。
ce="宋体" size="2">附加说明
ce="宋体" size="2">在编写具有SUID/SGID权限的程序时请勿使用system()࿰c;system()会继承环境变量࿰c;通过环境变量可能会造成系统安全的问题。
ce="宋体" size="2">范例
ce="宋体" size="2">#include<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
ce="宋体" size="2">执行
ce="宋体" size="2">-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc196">
ce="宋体" size="2">
ce="宋体" size="2">
wait(等待子进程中断或结束)
ce="宋体" size="2">相关函数
ce="宋体" size="2">waitpid࿰c;fork
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<sys/types.h>
#include<sys/wait.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">pid_t wait (int * status);
ce="宋体" size="2">函数说明
ce="宋体" size="2">wait()会暂时停止目前进程的执行࿰c;直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束࿰c;则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回࿰c;而子进程的进程识别码也会一快返回。如果不在意结束状态值࿰c;则
ce="宋体" size="2">参数
ce="宋体" size="2">status可以设成NULL。子进程的结束状态值请参考waitpid()。
ce="宋体" size="2">返回值
ce="宋体" size="2">如果执行成功则返回子进程识别码(PID)࿰c;如果有错误发生则返回-1。失败原因存于errno中。
ce="宋体" size="2">附加说明
ce="宋体" size="2">
ce="宋体" size="2">范例
ce="宋体" size="2">#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);
}
}
ce="宋体" size="2">执行
ce="宋体" size="2">This is the child process.pid=1501
This is the parent process .wait for child...
child’s pid =1501,exit status =5
 

ce="宋体" size="2">class="tags" href="/tags/LINUX.html" title=linux>linuxc197">
ce="宋体" size="2">
ce="宋体" size="2">
waitpid(等待子进程中断或结束)
ce="宋体" size="2">相关函数
ce="宋体" size="2">wait࿰c;fork
ce="宋体" size="2">表头文件
ce="宋体" size="2">#include<sys/types.h>
#include<sys/wait.h>
ce="宋体" size="2">定义函数
ce="宋体" size="2">pid_t waitpid(pid_t pid,int * status,int options);
ce="宋体" size="2">函数说明
ce="宋体" size="2">waitpid()会暂时停止目前进程的执行࿰c;直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束࿰c;则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回࿰c;而子进程的进程识别码也会一快返回。如果不在意结束状态值࿰c;则参数status可以设成NULL。参数pid为欲等待的子进程识别码࿰c;其他数值意义如下:
pid<-1 等待进程组识别码为pid绝对值的任何子进程。
pid=-1 等待任何子进程࿰c;相当于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid的子进程。
参数option可以为0 或下面的OR 组合
WNOHANG 如果没有任何已经结束的子进程则马上返回࿰c;不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回࿰c;但结束状态不予以理会。
子进程的结束状态返回后存于status࿰c;底下有几个宏可判别结束情况
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码࿰c;一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信号而中止的信号代码࿰c;一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码࿰c;一般会先用WIFSTOPPED 来判断后才使用此宏。
ce="宋体" size="2">返回值
ce="宋体" size="2">如果执行成功则返回子进程识别码(PID)࿰c;如果有错误发生则返回-1。失败原因存于errno中。
ce="宋体" size="2">范例
ce="宋体" size="2">参考wait()。
 
cle>

http://www.niftyadmin.cn/n/1850899.html

相关文章

gsensor架构和原理分析

本文主要描述了在android2.3平台G-sensor相关软硬件的体系架构和实现原理&#xff0c;按照Applications、Framework、HAL、Driver和Hardware五大层次分别介绍。 1.系统架构 (Architecture) 1.1 Android体系架构图 1.2 Sensor子系统架构图 Application Framework Sensor应用程…

Java直接内存与堆内存

NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer&#xff0c;但和普通的ByteBuffer不同&#xff0c;普通的ByteBuffer仍在JVM堆上分配内存&#xff0c;其最大内存受到最大堆内存的限制&#xff1b;而Direct…

Linux 常用C函数(内存及字符串操作篇1)

Linux 常用C函数(内存及字符串操作篇1)2007-03-22 11:35bcmp&#xff08;比较内存内容&#xff09; 相关函数 bcmp&#xff0c;strcasecmp&#xff0c;strcmp&#xff0c;strcoll&#xff0c;strncmp&#xff0c;strncasecmp 表头文件 #include<string.h> 定义函数 int …

9-SearchingFilesAndDirectories

grep 搜索文件内容的信息-i 不区分大小写-n 显示所在的行-c 显示有多少行包含-v 显示不包含的行-l 寻找包含该单词的文件cat 1.txt |grep -n p2: 824 pts/1 0:01 bash3: 819 pts/1 0:00 sh4: 1121 pts/1 0:00 pscd /etcgrep -l root group passwd hosts…

zabbix主动模式无法获取网卡和文件系统数据

zabbix版本为4.2&#xff0c;根据网上教程将zabbixagent设置成主动模式后&#xff0c;将templates中各Items的type改为Zabbix agent (active)&#xff0c;同时将Discovery rules中网卡及文件系统相关的两个rules的Type改成了Zabbix agent (active)。结果是CPU内存等数据都有&am…

select poll

select(poll)系统调用实现解析(三) 2011-06-26 20:29 阅读(2753) 评论(1)select(poll)系统调用实现解析(二) 2011-06-26 20:27 阅读(1671) 评论(0)select(poll)系统调用实现解析(一) 2011-06-26 20:23 阅读(2338) 评论(8)select(poll)在应用程序中如何使用 2011-06-26 20:18 阅…

Linux 常用C函数(内存及字符串操作篇2)

Linux 常用C函数(内存及字符串操作篇2)2007-03-22 11:36strcat&#xff08;连接两字符串&#xff09; 相关函数 bcopy&#xff0c;memccpy&#xff0c;memcpy&#xff0c;strcpy&#xff0c;strncpy 表头文件 #include <string.h> 定义函数 char *strcat (char *dest,co…

电源管理好的博文

android电池&#xff08;五&#xff09;&#xff1a;电池 充电IC&#xff08;PM2301&#xff09;驱动分析篇 2013-05-24 16:07 阅读(3018) 评论(2)android电池&#xff08;四&#xff09;&#xff1a;电池 电量计(MAX17040)驱动分析篇 2013-05-24 12:35 阅读(3904) 评论(12)and…