C中进程管理函数
整体概述
atexit():设置程序正常结束前调用的函数
execl():执行文件函数
execlp():从PATH环境变量中查找文件并执行
execv():执行文件函数
execve():执行文件函数
execvp():执行文件函数
exit():结束进程
_exit():结束进程执行
getpgid():获取进程组识别码
getpgrp():获取进程组识别码
getpid():获取进程识别码
getppid():获得父进程的进程识别码
getpriority():获取程序进程执行优先权
nice():改变进程优先顺序
on_exit():设置程序正常结束前调用的函数
setpgid():设置进程组识别码函数
setpgrp():设置进程组识别码
setpriority():设置程序进程执行优先权
system():执行shell命令
wait():结束(中断)进程函数
waitpid():结束(中断)进程函数(等待子进程中断)
fprintf():输出函数(格式化输出数据至文件)
fscanf():输入函数
scanf():字符串输入函数
vfprintf():输出函数(格式化输出数据至文件)
vfscanf():输入函数(先格式化字符串再输入)
vprintf():输出函数
vscanf():字符串格式化输入函数
vsprintf():格式化字符串
vsscanf():字符串输入函数
vfork():建立新的进程
详细介绍
atexit函数
int atexit(void (*function)(void));
函数说明:atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。
返回值:如果执行成功则返回0,否则返回-1,失败原因存于errno中。
execl函数
int execl(const char *path, const char *arg, …);
函数说明:execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv[0],argv[1],…,最后一个参数必须用空指针(NULL)作结束。
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存在于errno中。
execlp函数
int execlp(const char *file, const char *arg, …);
函数说明:execlp()会从PATH环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的agrv[0],argv[1],…,最后一个参数必须用空指针(NULL)做结束。
返回值:如果执行成功则函数不会反悔,执行失败,则直接返回-1,失败原因存于errno中。
execv函数
execv(const char *path, char *const argv[]);
函数说明:execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execv()只需要两个参数,第二个参数利用数组指针来传递给执行文件。
返回值:如果执行成功则函数不会反悔,执行失败则直接返回-1,失败原因存于errno中。
execve函数
int execve(const char *filename, char *const argv[], char *const envp[]);
函数说明:execve()用来执行参数filename字符串所代表的文件路径,第二个参数利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
execvp函数
int execvp(const char *file, char *const argv[]);
函数说明:execvp()会从PATH环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给欲执行的文件。
返回值:如果执行成功则函数不会返回,执行失败则执行返回-1,失败原因存于errno中。
exit函数
void exit(int status);
函数说明:exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。
vfork函数
pid_t vfork(void);
函数说明:vfork()会产生一个新的子进程,其子进程会复制父进程的数据和堆栈空间,并继承父进程的用户代码,组代码,环境变量,已打开的文件代码,工作目录和资源限制等。Linux使用copy-on-write(COW)技术,只有当其中一个进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。
返回值:如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork失败则直接返回-1,失败原因存于errno中。
错误代码:
EAGAIN:内存不足 ENOMEM:内存不足,无法配置核心所需的数据结构空间
_exit函数
void _exit(int status);
函数说明:_exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。
注意:_exit()不会处理标准I/O缓冲区,如果更新缓冲区可以使用exit()。
getpgid函数
pid_t getpgid(pid_t pid);
函数说明:getpgid()用来取得参数pid指定进程所属的组识别码。如果参数pid为0,则会取得目前进程的组识别码。
返回值:执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
错误代码:
ESRCH找不到符合参数pid指定的进程。
getpgrp函数
pid_t getpgrp(void);
函数说明:getpgrp()用来取得目前进程所属的组识别码。此函数相当于调用getpgid(0);
返回值:返回目前进程所属的组识别吗。
getpid函数
pid_t getpid(void);
函数说明:getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值:目前进程的进程识别码。
getppid函数
pid_t getppid(void);
函数说明:getppid()用来取得目前进程的父进程识别码。
返回值:目前进程的父进程识别码。
getpriority函数
int getpriority(int which, int who);
函数说明:getpriority()用来取得进程、进程组和用户组的进程执行优先权。参数which有三种数值,参数who则依which值有不同定义。
which who代表的意义:
1):PRIO_PROCESS who:为进程识别码 2):PRIO_PGRP who:为进程的组识别吗 3):PRIO_USER who:为用户识别码此函数返回的数值介于-20至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁
返回值:返回进程执行优先权,如有错误发生则返回值为-1,且错误原因存于errno中。
注意:由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最后在调用次函数前先清除errno变量。
错误代码:
1):ESRCH 参数which或who可能有错误,而找不到符合的进程。 2):EINVAL 参数which值错误。
nice函数
int nice(int inc);
函数说明:nice()函数用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面。即表示进程执行会越慢。只有超级用户才能使用负的inc,代表优先顺序排在前面,进程执行会较快。
返回值:如果执行成功则返回0,否则返回-1,失败原因存在于errno中。
错误代码:
EPERM:一般用户企图转用负的参数inc值改变进程优先顺序。
on_exit函数
int on_exit(void(* function)(int void *), void *arg);
函数说明:on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。参数arg指针会传给参数function函数。
返回值:如果执行成功则返回0,否则返回-1,失败原因存于errno中。
setpgid函数
int setpgid(pid_t pid, pid_t pgid);
函数说明:setpgid()将参数pid指定进程所属的组识别码设为参数pgid指定的组识别码。如果参数pid为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。
返回值:执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
错误代码:
1):EINVAL 参数pgid小于0 2):EPERM 进程权限不足,无法完成调用 3):ESRCH 找不到符合参数pid指定的进程。
serpgrp函数
int setpgrp(void);
函数说明:setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0, 0).
返回值:执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
setpriority函数
int setpriority(int which, int who, int prio);
函数说明:serpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who则依which值有不同定义。
which who代表的定义:
1):PRIO_PROCESS who 为进程识别码 2):PRIO_PGRP who为进程的组识别码 3):PRIO_USER who为用户识别码
参数prio介于-20至20之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。
返回值:执行成功则返回0,如果有错误发生返回值为-1,错误原因存于errno中。
1):ESRCH 参数which或who可能有错,而找不到符合的进程 2):EINVAL 参数which值错误 3):EPERM 权限不够,无法完成设置 4):EACESS 一般用户无法降低优先权
system函数
int system(const char *string);
函数说明:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行string字符串所代表的命令,此命令执行完成后随即返回原调用的进程。在调用system()期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT信号则会被忽略。
返回值:
1):如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1 2):若参数string为空指针(NULL),则返回非零值 3):如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功。
注意:在编写具有SUID/SGID权限的程序时,请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。
wait函数
pid_t wait(int *status);
函数说明:wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会很快返回。如果不在意结束状态值,则参数status可以设成NULL。子进程的结束状态值可参考waitpid()。
返回值:如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1,失败原因存于errno中。
waitpid函数
pid_t waitpid(pid_t pid, int *status, int options);
函数说明:waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会快速返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:
1):pid<-1 等待进程组识别码为pid绝对值的任何子进程 2):pid=-1 等待任何子进程,相当于wait() 3):pid=0 等待进程组识别码与目前进程相同的任何子进程 4):pid>0 等待任何子进程识别码为pid的子进程
参数option可以为0或下面的OR组合:
1)WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待 2)WUNTRACED 如果子进程进入执行情况则马上返回,但结束状态不予以理会。子进程的结束状态返回后存于status,底下有几个宏可判别结束情况 3)WIFEXITED(status):如果子进程正常结束则为非0值 4)WEXITSTATUS(status):取得子进程exit()返回的结束代码,一般会先用WIFEXITED来判断是否正常结束才能使用此宏。 5)WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真 6)WTERMSIG(status):取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED来判断后才使用此宏。 7)WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED时才会有此情况。 8)WSTOPSIG(status):取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED来判断后才使用此宏。
返回值:如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败的原因存于errno中。
fprintf函数
int fprintf(FILE *stream, const char *format, …);
函数说明:fprintf()会根据参数format字符串来转换格式化数据,然后将输出结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止。
返回值:关于参数format字符串的格式可参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。
fscanf函数
int fscanf(FILE *stream, const char *format, …);
函数说明:fscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结构存于对应的参数内。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
printf函数
int printf(char *format, …);
函数说明:printf()会根据参数format字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束(’\0’)为止。
参数format字符串可包含下列三种字符类型:
一般文本,将会直接输出 ASCII控制字符,如\t,\n等有特定含义 格式转换字符
格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必须有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其对应的转换字符类型相同。
printf()格式转换的一般形式如下:
%(flags)(width)(. prec)type
以括号括起来的参数为选择性参数,而%与type则是必须的。type类型如下:
1)整数 %d 整数的参数会被转成有符号的十进制数字 %u 整数的参数会被转成无符号的十进制数字 %o 整数的参数会被转成无符号的八进制数字 %x 整数的参数会被转成无符号的十六进制数字,并以小写abcdef 表示 %X 整数的参数会被转成无符号的十六进制数字,并以大写ABCDEF 表示浮点型数 %f double型的参数会被转成十进制数字,并取到小数点以下六位,四舍五入 %e double型的参数以指数形式打印,有一个数字会在小数点前,六位数字在小数点后,而在指数部分会以小写的e 来表示 %E与%e 作用相同,唯一区别是指数部分将以大写的E来表示 %g double型的参数会自动选择以%f或%e的格式来打印,其标准是根据打印的数值及所设置的有效位数来决定。 %G与%g 作用相同,唯一区别在以指数形态打印时会选择%E格式。 2)字符及字符串 %c 整型数的参数会被转成unsigned char型打印出 %s 指向字符串的参数会被逐字输出,直到出现NULL字符为止 %p 如果是参数是"void *"型指针则使用十六进制格式显示 prec 有几种情况: 正整数的最小位数 在浮点型数中代表小数位数 格式代表有效位数的最大值 在%s格式代表字符串的最大长度 若为×符号则代表下个参数值为最大长度
width为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。
flags 有下列几种情况
+ 一般在打印负数时,printf()会加印一个负号,整数则不加任何负号,此旗标会使得在打印正数前多一个正号(+)。 # 此旗标会根据其后转换字符的不同而有不同含义。当在类型为o之前 (如%#o),则会在打印八进制数值前多印一个o。 而在类型为x之前 (%#x)则会在打印十六进制数前多印'0x',在型态为e、E、f、g或G之前则会强迫数值打印小数点。 在类型为g或G之前时则同时保留小数点及小数位数末尾的零。 0 当有指定参数时,无数字的参数将补上0。默认是关闭此旗标,所以一般会打印出空白字符。
返回值:成功则返回写入的字符数目。如果发生写入错误,将会设置文件错误标志(可通过ferror()检测),并返回一个负数。如果在写入宽字符时一个多字节的字符发生编码错误,那么errno将被设置为EILSEQ,并返回一个负数。
scanf函数
int scanf(const char *format, …);
函数说明:scanf()会将输入的数据根据参数format字符串来转换并格式化数据。
scanf()格式转换一般形式如下:%[size][l][h]type以中括号括起来的参数为选择性参数,而%与type则是必要的。代表该对应的参数数据忽略不保存;Size为允许参数输入的数据长度;l输入的数据数值以long int或double型保存;h输入的数据数值以short int型保存。
type的类型如下:
%d 输入的数据会被转成一有符号的十进制数字(int) %i 输入的数据会被转成一有符号的十进制数字,若输入数据以"ox"或"OX"开头代表转换十六进制数字,若以"o"开头则转换八进制数字,其他情况代表十进制 %o 输入的数据会被转换成一无符号的八进制数字 %u 输入的数据会被转换成一无符号的正整数 %x 输入的数据为无符号的十六进制数字,转换后存于unsigned int型变量 %X 同%x %f 输入的数据为有符号的浮点型数,转换后存于float型变量 %e 同%f %E 同%f %g 同%f %s 输入数据为以空格字符为终止的字符串 %c 输入数据为单一字符 [] 读取数据但只允许括号内的字符。如[a-z] [^] 读取数据但不允许中括号的^符号后的字符出现,如[^0-9]。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
sprintf函数
int sprintf(char *str, char *format [, argument, …]);
函数说明:sprinf()用于将格式化的数据写入字符串,其中参数str为写入的字符串,format为格式化字符串,与printf()函数相同,argument为变量。参数中,除了前两个参数类型固定外,后面可以接任意多个参数。而他的精华,显然就在第二个参数——格式化字符串上。printf()和sprintf()都是用格式化字符串来指定串的格式,在格式串内部使用一些%开头的格式说明符来占据一个位置,在后边的变参列表汇总提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。sprinf()的作用是将一个格式化的字符串输出到一个目的字符串中,而printf()是将一个格式化的字符串输出到屏幕。sprintf()的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现“改程序产生非法操作,即将被关闭”的提示。
返回值:成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。
注意:C中对数组进行操作时,并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统。
sscanf函数
int sscanf(char *str, char *format [, argument, …]);
函数说明:sscanf()用于从字符串中读取指定格式的数据。参数str为要读取数据的字符串;format为用户指定的格式,argument为变量,用来保存读取到的数据。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
注意:sscanf()会将参数str的字符串根据参数format(格式化字符串)来转换并格式化数据,转换后的结果存于对应的变量中。sscanf()与scanf()类似,都用于输入,只是scanf()以键盘(stdin)为输入源,sscanf()以固定字符串为输入源。
vfprintf函数
int vfprintf(FILE *stream, const char *format, va_list ap);
函数说明:vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(’\0’)为止。
返回值:成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。
vfscaf函数
int vfscanf(FILE *stream, const char *format, va_list ap);
函数说明:vfscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
vprinf函数
int vprintf(const char *format, va_list ap);
函数说明:vprintf()作用和printf()相同,参数format格式也相同。va_list为不定个数的参数列。
返回值:成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。
vscanf函数
int vscanf(const char *format, va_list ap);
函数说明:vscanf()会将输入的数据根据参数format字符串来转换并格式化。转换后的结构存于对应的参数内。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
vsprintf函数
int vsprintf(char *str, const char *format, va_list ap);
函数说明:vsprinf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束‘\0’为止。
返回值:成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。
vsscanf函数
int vsscanf(const char *str, const char *format, va_list ap);
函数说明:vsscanf()会将参数str字符串根据参数format字符串来转换并格式化数据。
返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。