| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 软件开发

Linux常用C函数-进程操作篇

时间:2006-11-01 10:22:20  来源:Linux联盟收集  作者:
进程操作篇YBZLinux联盟
atexit,YBZLinux联盟
execl,YBZLinux联盟
execlp,YBZLinux联盟
execv,YBZLinux联盟
execve,YBZLinux联盟
execvp,YBZLinux联盟
exit,YBZLinux联盟
_exit,YBZLinux联盟
vfork,YBZLinux联盟
getpgid,YBZLinux联盟
getpgrp,YBZLinux联盟
getpid,YBZLinux联盟
getppid,YBZLinux联盟
getpriority,YBZLinux联盟
nice,YBZLinux联盟
on_exit,YBZLinux联盟
setpgid,YBZLinux联盟
setpgrp,YBZLinux联盟
setpriority,YBZLinux联盟
system,YBZLinux联盟
wait,YBZLinux联盟
waitpid,YBZLinux联盟
fprintf,YBZLinux联盟
fscanf,YBZLinux联盟
printf,YBZLinux联盟
sacnf,YBZLinux联盟
sprintf,YBZLinux联盟
sscanf,YBZLinux联盟
vfprintf,YBZLinux联盟
vfscanf,YBZLinux联盟
vprintf,YBZLinux联盟
vscanf,YBZLinux联盟
vsprintf,YBZLinux联盟
vsscanf,YBZLinux联盟
atexit(设置程序正常结束前调用的函数)
相关函数
_exit,exit,on_exitYBZLinux联盟
表头文件
#include<stdlib.h>YBZLinux联盟
定义函数
int atexit (void (*function)(void));YBZLinux联盟
函数说明
atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。YBZLinux联盟
返回值
如果执行成功则返回0,否则返回-1,失败原因存于errno中。YBZLinux联盟
范例
#include<stdlib.h>YBZLinux联盟
void my_exit(void)YBZLinux联盟
{YBZLinux联盟
printf(“before exit () !\n”);YBZLinux联盟
}YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
atexit (my_exit);YBZLinux联盟
exit(0);YBZLinux联盟
}YBZLinux联盟
执行
before exit()!YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
execl(执行文件)
相关函数
fork,execle,execlp,execv,execve,execvpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int execl(const char * path,const char * arg,....);YBZLinux联盟
函数说明
execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。YBZLinux联盟
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);YBZLinux联盟
}YBZLinux联盟
执行
/*执行/bin/ls -al /etc/passwd */YBZLinux联盟
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
execlp(从PATH 环境变量中查找文件并执行)
相关函数
fork,execl,execle,execv,execve,execvpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int execlp(const char * file,const char * arg,……);YBZLinux联盟
函数说明
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。YBZLinux联盟
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。YBZLinux联盟
错误代码
参考execve()。YBZLinux联盟
范例
/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */YBZLinux联盟
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);YBZLinux联盟
}YBZLinux联盟
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
execv(执行文件)
相关函数
fork,execl,execle,execlp,execve,execvpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int execv (const char * path, char * const argv[ ]);YBZLinux联盟
函数说明
execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。YBZLinux联盟
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。YBZLinux联盟
错误代码
请参考execve()。YBZLinux联盟
范例
/* 执行/bin/ls -al /etc/passwd */YBZLinux联盟
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};YBZLinux联盟
execv(“/bin/ls”,argv);YBZLinux联盟
}YBZLinux联盟
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
execve(执行文件)
相关函数
fork,execl,execle,execlp,execv,execvpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);YBZLinux联盟
函数说明
execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。YBZLinux联盟
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。YBZLinux联盟
错误代码
EACCESYBZLinux联盟
1. 欲执行的文件不具有用户可执行的权限。YBZLinux联盟
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。YBZLinux联盟
3.欲执行的文件或script翻译器非一般文件。YBZLinux联盟
EPERMYBZLinux联盟
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。YBZLinux联盟
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。YBZLinux联盟
E2BIG 参数数组过大YBZLinux联盟
ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。YBZLinux联盟
EFAULT 参数filename所指的字符串地址超出可存取空间范围。YBZLinux联盟
ENAMETOOLONG 参数filename所指的字符串太长。YBZLinux联盟
ENOENT 参数filename字符串所指定的文件不存在。YBZLinux联盟
ENOMEM 核心内存不足YBZLinux联盟
ENOTDIR 参数filename字符串所包含的目录路径并非有效目录YBZLinux联盟
EACCES 参数filename字符串所包含的目录路径无法存取,权限不足YBZLinux联盟
ELOOP 过多的符号连接YBZLinux联盟
ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中YBZLinux联盟
EIO I/O 存取错误YBZLinux联盟
ENFILE 已达到系统所允许的打开文件总数。YBZLinux联盟
EMFILE 已达到系统所允许单一进程所能打开的文件总数。YBZLinux联盟
EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区YBZLinux联盟
EISDIR ELF翻译器为一目录YBZLinux联盟
ELIBBAD ELF翻译器有问题。YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};YBZLinux联盟
char * envp[ ]={“PATH=/bin”,0}YBZLinux联盟
execve(“/bin/ls”,argv,envp);YBZLinux联盟
}YBZLinux联盟
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
execvp(执行文件)
相关函数
fork,execl,execle,execlp,execv,execveYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int execvp(const char *file ,char * const argv []);YBZLinux联盟
函数说明
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。YBZLinux联盟
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。YBZLinux联盟
错误代码
请参考execve()。YBZLinux联盟
范例
/*请与execlp()范例对照*/YBZLinux联盟
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};YBZLinux联盟
execvp(“ls”,argv);YBZLinux联盟
}YBZLinux联盟
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
exit(正常结束进程)
相关函数
_exit,atexit,on_exitYBZLinux联盟
表头文件
#include<stdlib.h>YBZLinux联盟
定义函数
void exit(int status);YBZLinux联盟
函数说明
exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。YBZLinux联盟
返回值
YBZLinux联盟
范例
参考wait()YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
_
YBZLinux联盟
exit(结束进程执行)
相关函数
exit,wait,abortYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
void _exit(int status);YBZLinux联盟
函数说明
_exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。YBZLinux联盟
返回值
YBZLinux联盟
附加说明
_exit()不会处理标准I/O 缓冲区,如要更新缓冲区请使用exit()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vfork(建立一个新的进程)
相关函数
wait,execveYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
pid_t vfork(void);YBZLinux联盟
函数说明
vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意YBZLinux联盟
死锁或竞争条件的发生。
YBZLinux联盟
返回值
如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork 失败则直接返回-1,失败原因存于errno中。YBZLinux联盟
错误代码
EAGAIN 内存不足。ENOMEM 内存不足,无法配置核心所需的数据结构空间。YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
if(vfork() = =0)YBZLinux联盟
{YBZLinux联盟
printf(“This is the child process\n”);YBZLinux联盟
}else{YBZLinux联盟
printf(“This is the parent process\n”);YBZLinux联盟
}YBZLinux联盟
}YBZLinux联盟
执行
this is the parent processYBZLinux联盟
this is the child processYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
getpgid(取得进程组识别码)
相关函数
setpgid,setpgrp,getpgrpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
pid_t getpgid( pid_t pid);YBZLinux联盟
函数说明
getpgid()用来取得参数pid 指定进程所属的组识别码。如果参数pid为0,则会取得目前进程的组识别码。YBZLinux联盟
返回值
执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。YBZLinux联盟
错误代码
ESRCH 找不到符合参数pid 指定的进程。YBZLinux联盟
范例
/*取得init 进程(pid=1)的组识别码*/YBZLinux联盟
#include<unistd.h>YBZLinux联盟
mian()YBZLinux联盟
{YBZLinux联盟
printf(“init gid = %d\n”,getpgid(1));YBZLinux联盟
}YBZLinux联盟
执行
init gid = 0YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
getpgrp(取得进程组识别码)
相关函数
setpgid,getpgid,getpgrpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
pid_t getpgrp(void);YBZLinux联盟
函数说明
getpgrp()用来取得目前进程所属的组识别码。此函数相当于调用getpgid(0);YBZLinux联盟
返回值
返回目前进程所属的组识别码。YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
printf(“my gid =%d\n”,getpgrp());YBZLinux联盟
}YBZLinux联盟
执行
my gid =29546YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
getpid(取得进程识别码)
相关函数
fork,kill,getpidYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
pid_t getpid(void);YBZLinux联盟
函数说明
getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。YBZLinux联盟
返回值
目前进程的进程识别码YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
printf(“pid=%d\n”,getpid());YBZLinux联盟
}YBZLinux联盟
执行
pid=1494 /*每次执行结果都不一定相同*/YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
getppid(取得父进程的进程识别码)
相关函数
fork,kill,getpidYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
pid_t getppid(void);YBZLinux联盟
函数说明
getppid()用来取得目前进程的父进程识别码。YBZLinux联盟
返回值
目前进程的父进程识别码。YBZLinux联盟
范例
#include<unistd.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
printf(“My parent ‘pid =%d\n”,getppid());YBZLinux联盟
}YBZLinux联盟
执行
My parent pid =463YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
getpriority(取得程序进程执行优先权)
相关函数
setpriority,niceYBZLinux联盟
表头文件
#include<sys/time.h>YBZLinux联盟
#include<sys/resource.h>YBZLinux联盟
定义函数
int getpriority(int which,int who);YBZLinux联盟
函数说明
getpriority()可用来取得进程、进程组和用户的进程执行优先权。YBZLinux联盟
参数
which有三种数值,参数who 则依which值有不同定义YBZLinux联盟
which who 代表的意义YBZLinux联盟
PRIO_PROCESS who 为进程识别码YBZLinux联盟
PRIO_PGRP who 为进程的组识别码YBZLinux联盟
PRIO_USER who 为用户识别码YBZLinux联盟
此函数返回的数值介于-20 至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。YBZLinux联盟
返回值
返回进程执行优先权,如有错误发生返回值则为-1 且错误原因存于errno。YBZLinux联盟
附加说明
由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最好在调用次函数前先清除errno变量。YBZLinux联盟
错误代码
ESRCH 参数which或who 可能有错,而找不到符合的进程。EINVAL 参数which 值错误。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
nice(改变进程优先顺序)
相关函数
setpriority,getpriorityYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int nice(int inc);YBZLinux联盟
函数说明
nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。只有超级用户才能使用负的inc 值,代表优先顺序排在前面,进程执行会较快。YBZLinux联盟
返回值
如果执行成功则返回0,否则返回-1,失败原因存于errno中。YBZLinux联盟
错误代码
EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
on_exit(设置程序正常结束前调用的函数)
相关函数
_exit,atexit,exitYBZLinux联盟
表头文件
#include<stdlib.h>YBZLinux联盟
定义函数
int on_exit(void (* function)(int, void*),void *arg);YBZLinux联盟
函数说明
on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。参数arg指针会传给参数function函数,详细情况请见范例。YBZLinux联盟
返回值
如果执行成功则返回0,否则返回-1,失败原因存于errno中。YBZLinux联盟
附加说明
YBZLinux联盟
范例
#include<stdlib.h>YBZLinux联盟
void my_exit(int status,void *arg)YBZLinux联盟
{YBZLinux联盟
printf(“before exit()!\n”);YBZLinux联盟
printf(“exit (%d)\n”,status);YBZLinux联盟
printf(“arg = %s\n”,(char*)arg);YBZLinux联盟
}YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
char * str=”test”;YBZLinux联盟
on_exit(my_exit,(void *)str);YBZLinux联盟
exit(1234);YBZLinux联盟
}YBZLinux联盟
执行
before exit()!YBZLinux联盟
exit (1234)YBZLinux联盟
arg = testYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
setpgid(设置进程组识别码)
相关函数
getpgid,setpgrp,getpgrpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int setpgid(pid_t pid,pid_t pgid);YBZLinux联盟
函数说明
setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。YBZLinux联盟
返回值
执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。YBZLinux联盟
错误代码
EINVAL 参数pgid小于0。YBZLinux联盟
EPERM 进程权限不足,无法完成调用。YBZLinux联盟
ESRCH 找不到符合参数pid指定的进程。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
setpgrp(设置进程组识别码)
相关函数
getpgid,setpgid,getpgrpYBZLinux联盟
表头文件
#include<unistd.h>YBZLinux联盟
定义函数
int setpgrp(void);YBZLinux联盟
函数说明
setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。YBZLinux联盟
返回值
执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
setpriority(设置程序进程执行优先权)
相关函数
getpriority,niceYBZLinux联盟
表头文件
#include<sys/time.h>YBZLinux联盟
#include<sys/resource.h>YBZLinux联盟
定义函数
int setpriority(int which,int who, int prio);YBZLinux联盟
函数说明
setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义YBZLinux联盟
which who 代表的意义YBZLinux联盟
PRIO_PROCESS who为进程识别码YBZLinux联盟
PRIO_PGRP who 为进程的组识别码YBZLinux联盟
PRIO_USER who为用户识别码YBZLinux联盟
参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。YBZLinux联盟
返回值
执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。YBZLinux联盟
ESRCH 参数which或who 可能有错,而找不到符合的进程YBZLinux联盟
EINVAL 参数which值错误。YBZLinux联盟
EPERM 权限不够,无法完成设置YBZLinux联盟
EACCES 一般用户无法降低优先权YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
system(执行shell 命令)
相关函数
fork,execve,waitpid,popenYBZLinux联盟
表头文件
#include<stdlib.h>YBZLinux联盟
定义函数
int system(const char * string);YBZLinux联盟
函数说明
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。YBZLinux联盟
返回值
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。YBZLinux联盟
附加说明
在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。YBZLinux联盟
范例
#include<stdlib.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
system(“ls -al /etc/passwd /etc/shadow”);YBZLinux联盟
}YBZLinux联盟
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwdYBZLinux联盟
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadowYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
wait(等待子进程中断或结束)
相关函数
waitpid,forkYBZLinux联盟
表头文件
#include<sys/types.h>YBZLinux联盟
#include<sys/wait.h>YBZLinux联盟
定义函数
pid_t wait (int * status);YBZLinux联盟
函数说明
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则YBZLinux联盟
参数
status可以设成NULL。子进程的结束状态值请参考waitpid()。YBZLinux联盟
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。YBZLinux联盟
附加说明
YBZLinux联盟
范例
#include<stdlib.h>YBZLinux联盟
#include<unistd.h>YBZLinux联盟
#include<sys/types.h>YBZLinux联盟
#include<sys/wait.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
pid_t pid;YBZLinux联盟
int status,i;YBZLinux联盟
if(fork()= =0){YBZLinux联盟
printf(“This is the child process .pid =%d\n”,getpid());YBZLinux联盟
exit(5);YBZLinux联盟
}else{YBZLinux联盟
sleep(1);YBZLinux联盟
printf(“This is the parent process ,wait for child...\n”;YBZLinux联盟
pid=wait(&status);YBZLinux联盟
i=WEXITSTATUS(status);YBZLinux联盟
printf(“child’s pid =%d .exit status=^d\n”,pid,i);YBZLinux联盟
}YBZLinux联盟
}YBZLinux联盟
执行
This is the child process.pid=1501YBZLinux联盟
This is the parent process .wait for child...YBZLinux联盟
child’s pid =1501,exit status =5YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
waitpid(等待子进程中断或结束)
相关函数
wait,forkYBZLinux联盟
表头文件
#include<sys/types.h>YBZLinux联盟
#include<sys/wait.h>YBZLinux联盟
定义函数
pid_t waitpid(pid_t pid,int * status,int options);YBZLinux联盟
函数说明
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:YBZLinux联盟
pid<-1 等待进程组识别码为pid绝对值的任何子进程。YBZLinux联盟
pid=-1 等待任何子进程,相当于wait()。YBZLinux联盟
pid=0 等待进程组识别码与目前进程相同的任何子进程。YBZLinux联盟
pid>0 等待任何子进程识别码为pid的子进程。YBZLinux联盟
参数option可以为0 或下面的OR 组合YBZLinux联盟
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。YBZLinux联盟
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。YBZLinux联盟
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况YBZLinux联盟
WIFEXITED(status)如果子进程正常结束则为非0值。YBZLinux联盟
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。YBZLinux联盟
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真YBZLinux联盟
WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。YBZLinux联盟
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。YBZLinux联盟
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。YBZLinux联盟
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。YBZLinux联盟
范例
参考wait()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
fprintf(格式化输出数据至文件)
相关函数
printf,fscanf,vfprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int fprintf(FILE * stream, const char * format,.......);YBZLinux联盟
函数说明
fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。YBZLinux联盟
返回值
关于参数format字符串的格式请参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i = 150;YBZLinux联盟
int j = -100;YBZLinux联盟
double k = 3.14159;YBZLinux联盟
fprintf(stdout,”%d %f %x \n”,j,k,i);YBZLinux联盟
fprintf(stdout,”%2d %*d\n”,i,2,i);YBZLinux联盟
}YBZLinux联盟
执行
-100 3.141590 96YBZLinux联盟
150 150YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
fscanf(格式化字符串输入)
相关函数
scanf,sscanfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int fscanf(FILE * stream ,const char *format,....);YBZLinux联盟
函数说明
fscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结构存于对应的参数内。YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
附加说明
YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i;YBZLinux联盟
unsigned int j;YBZLinux联盟
char s[5];YBZLinux联盟
fscanf(stdin,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);YBZLinux联盟
printf(“%d %d %s \n”,i,j,s);YBZLinux联盟
}YBZLinux联盟
执行
10 0x1b aaaaaaaaa bbbbbbbbbb /*从键盘输入*/YBZLinux联盟
10 27 aaaaaYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
printf(格式化输出数据)
相关函数
scanf,snprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int printf(const char * format,.............);YBZLinux联盟
函数说明
printf()会根据参数format字符串来转换并格式化数据,然后将结果写出到标准输出设备,直到出现字符串结束('\0')为止。参数format字符串可包含下列三种字符类型YBZLinux联盟
1.一般文本,伴随直接输出。YBZLinux联盟
2.ASCII控制字符,如\t、\n等。YBZLinux联盟
3.格式转换字符。YBZLinux联盟
格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一printf()的参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。YBZLinux联盟
Printf()格式转换的一般形式如下YBZLinux联盟
%(flags)(width)(.prec)typeYBZLinux联盟
以中括号括起来的参数为选择性参数,而%与type则是必要的。底下先介绍type的几种形式YBZLinux联盟
整数YBZLinux联盟
%d 整数的参数会被转成一有符号的十进制数字YBZLinux联盟
%u 整数的参数会被转成一无符号的十进制数字YBZLinux联盟
%o 整数的参数会被转成一无符号的八进制数字YBZLinux联盟
%x 整数的参数会被转成一无符号的十六进制数字,并以小写abcdef表示YBZLinux联盟
%X 整数的参数会被转成一无符号的十六进制数字,并以大写ABCDEF表示浮点型数YBZLinux联盟
%f double 型的参数会被转成十进制数字,并取到小数点以下六位,四舍五入。YBZLinux联盟
%e double型的参数以指数形式打印,有一个数字会在小数点前,六位数字在小数点后,而在指数部分会以小写的e来表示。YBZLinux联盟
%E 与%e作用相同,唯一区别是指数部分将以大写的E 来表示。YBZLinux联盟
%g double 型的参数会自动选择以%f 或%e 的格式来打印,其标准是根据欲打印的数值及所设置的有效位数来决定。YBZLinux联盟
%G 与%g 作用相同,唯一区别在以指数形态打印时会选择%E 格式。YBZLinux联盟
字符及字符串YBZLinux联盟
%c 整型数的参数会被转成unsigned char型打印出。YBZLinux联盟
%s 指向字符串的参数会被逐字输出,直到出现NULL字符为止YBZLinux联盟
%p 如果是参数是“void *”型指针则使用十六进制格式显示。YBZLinux联盟
prec 有几种情况YBZLinux联盟
1. 正整数的最小位数。YBZLinux联盟
2.在浮点型数中代表小数位数YBZLinux联盟
3.在%g 格式代表有效位数的最大值。YBZLinux联盟
4.在%s格式代表字符串的最大长度。YBZLinux联盟
5.若为×符号则代表下个参数值为最大长度。YBZLinux联盟
width为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。YBZLinux联盟
flags 有下列几种情况YBZLinux联盟
#NAME?YBZLinux联盟
+ 一般在打印负数时,printf()会加印一个负号,整数则不加任何负号。此旗标会使得在打印正数前多一个正号(+)。YBZLinux联盟
# 此旗标会根据其后转换字符的不同而有不同含义。当在类型为o 之前(如%#o),则会在打印八进制数值前多印一个o。YBZLinux联盟
而在类型为x 之前(%#x)则会在打印十六进制数前多印’0x’,在型态为e、E、f、g或G 之前则会强迫数值打印小数点。在类型为g 或G之前时则同时保留小数点及小数位数末尾的零。YBZLinux联盟
0 当有指定参数时,无数字的参数将补上0。默认是关闭此旗标,所以一般会打印出空白字符。YBZLinux联盟
返回值
成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i = 150;YBZLinux联盟
int j = -100;YBZLinux联盟
double k = 3.14159;YBZLinux联盟
printf(“%d %f %x\n”,j,k,i);YBZLinux联盟
printf(“%2d %*d\n”,i,2,i); /*参数2 会代入格式*中,而与%2d同意义*/YBZLinux联盟
}YBZLinux联盟
执行
-100 3.14159 96YBZLinux联盟
150 150YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
sacnf(格式化字符串输入)
相关函数
fscanf,snprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int scanf(const char * format,.......);YBZLinux联盟
函数说明
scanf()会将输入的数据根据参数format字符串来转换并格式化数据。Scanf()格式转换的一般形式如下YBZLinux联盟
%[*][size][l][h]typeYBZLinux联盟
以中括号括起来的参数为选择性参数,而%与type则是必要的。YBZLinux联盟
* 代表该对应的参数数据忽略不保存。YBZLinux联盟
size 为允许参数输入的数据长度。YBZLinux联盟
l 输入的数据数值以long int 或double型保存。YBZLinux联盟
h 输入的数据数值以short int 型保存。YBZLinux联盟
底下介绍type的几种形式YBZLinux联盟
%d 输入的数据会被转成一有符号的十进制数字(int)。YBZLinux联盟
%i 输入的数据会被转成一有符号的十进制数字,若输入数据以“0x”或“0X”开头代表转换十六进制数字,若以“0”开头则转换八进制数字,其他情况代表十进制。YBZLinux联盟
%0 输入的数据会被转换成一无符号的八进制数字。YBZLinux联盟
%u 输入的数据会被转换成一无符号的正整数。YBZLinux联盟
%x 输入的数据为无符号的十六进制数字,转换后存于unsigned int型变量。YBZLinux联盟
%X 同%xYBZLinux联盟
%f 输入的数据为有符号的浮点型数,转换后存于float型变量。YBZLinux联盟
%e 同%fYBZLinux联盟
%E 同%fYBZLinux联盟
%g 同%fYBZLinux联盟
%s 输入数据为以空格字符为终止的字符串。YBZLinux联盟
%c 输入数据为单一字符。YBZLinux联盟
[] 读取数据但只允许括号内的字符。如[a-z]。YBZLinux联盟
[^] 读取数据但不允许中括号的^符号后的字符出现,如[^0-9].YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
#include <stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i;YBZLinux联盟
unsigned int j;YBZLinux联盟
char s[5];YBZLinux联盟
scanf(“%d %x %5[a-z] %*s %f”,&i,&j,s,s);YBZLinux联盟
printf(“%d %d %s\n”,i,j,s);YBZLinux联盟
}YBZLinux联盟
执行
10 0x1b aaaaaaaaaa bbbbbbbbbbYBZLinux联盟
10 27 aaaaaYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
sprintf(格式化字符串复制)
相关函数
printf,sprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int sprintf( char *str,const char * format,.........);YBZLinux联盟
函数说明
sprintf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。YBZLinux联盟
返回值
成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。YBZLinux联盟
附加说明
使用此函数得留意堆栈溢出,或改用snprintf()。YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
char * a=”This is string A!”;YBZLinux联盟
char buf[80];YBZLinux联盟
sprintf(buf,”>>> %s<<<\n”,a);YBZLinux联盟
printf(“%s”.buf);YBZLinux联盟
}YBZLinux联盟
执行
>>>This is string A!<<<YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
sscanf(格式化字符串输入)
相关函数
scanf,fscanfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int sscanf (const char *str,const char * format,........);YBZLinux联盟
函数说明
sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i;YBZLinux联盟
unsigned int j;YBZLinux联盟
char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”;YBZLinux联盟
char s[5];YBZLinux联盟
sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);YBZLinux联盟
printf(“%d %d %s\n”,i,j,s);YBZLinux联盟
}YBZLinux联盟
执行
10 27 aaaaaYBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vfprintf(格式化输出数据至文件)
相关函数
printf,fscanf,fprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
#include<stdarg.h>YBZLinux联盟
定义函数
int vfprintf(FILE *stream,const char * format,va_list ap);YBZLinux联盟
函数说明
vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。va_list用法请参考附录C或vprintf()范例。YBZLinux联盟
返回值
成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
参考fprintf()及vprintf()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vfscanf(格式化字符串输入)
相关函数
scanf,sscanf,fscanfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int vfscanf(FILE * stream,const char * format ,va_list ap);YBZLinux联盟
函数说明
vfscanf()会自参数stream 的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。va_list用法请参考附录C 或vprintf()。YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
参考fscanf()及vprintf()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vprintf(格式化输出数据)
相关函数
printf,vfprintf,vsprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
#include<stdarg.h>YBZLinux联盟
定义函数
int vprintf(const char * format,va_list ap);YBZLinux联盟
函数说明
vprintf()作用和printf()相同,参数format格式也相同。va_list为不定个数的参数列,用法及范例请参考附录C。YBZLinux联盟
返回值
成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
#include<stdio.h>YBZLinux联盟
#include<stdarg.h>YBZLinux联盟
int my_printf( const char *format,……)YBZLinux联盟
{YBZLinux联盟
va_list ap;YBZLinux联盟
int retval;YBZLinux联盟
va_start(ap,format);YBZLinux联盟
printf(“my_printf( ):”);YBZLinux联盟
retval = vprintf(format,ap);YBZLinux联盟
va_end(ap);YBZLinux联盟
return retval;YBZLinux联盟
}YBZLinux联盟
main()YBZLinux联盟
{YBZLinux联盟
int i = 150,j = -100;YBZLinux联盟
double k = 3.14159;YBZLinux联盟
my_printf(“%d %f %x\n”,j,k,i);YBZLinux联盟
my_printf(“%2d %*d\n”,i,2,i);YBZLinux联盟
}YBZLinux联盟
执行
my_printf() : -100 3.14159 96YBZLinux联盟
my_printf() : 150 150YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vscanf(格式化字符串输入)
相关函数
vsscanf,vfscanfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
#include<stdarg.h>YBZLinux联盟
定义函数
int vscanf( const char * format,va_list ap);YBZLinux联盟
函数说明
vscanf()会将输入的数据根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。va_list用法请参考附录C或vprintf()范例。YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
请参考scanf()及vprintf()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vsprintf(格式化字符串复制)
相关函数
vnsprintf,vprintf,snprintfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int vsprintf( char * str,const char * format,va_list ap);YBZLinux联盟
函数说明
vsprintf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。va_list用法请参考附录C或vprintf()范例。YBZLinux联盟
返回值
成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
请参考vprintf()及vsprintf()。YBZLinux联盟
 
YBZLinux联盟
YBZLinux联盟
YBZLinux联盟
vsscanf(格式化字符串输入)
相关函数
vscanf,vfscanfYBZLinux联盟
表头文件
#include<stdio.h>YBZLinux联盟
定义函数
int vsscanf(const char * str,const char * format,va_list ap);YBZLinux联盟
函数说明
vsscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考附录C 或vprintf()范例。YBZLinux联盟
返回值
成功则返回参数数目,失败则返回-1,错误原因存于errno中。YBZLinux联盟
范例
请参考sscanf()及vprintf()。YBZLinux联盟
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目更新
栏目热门