1.fork()
功能:创建一个新的进程.
语法:#i nclude
#i nclude
pid_t fork();
说明:本系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复
制品. 调用进程叫父进程, 子进程继承了父进程的几乎所有的属
性:
. 实际UID,GID和有效UID,GID.
. 环境变量.
. 附加GID.
. 调用exec()时的关闭标志.
. UID设置模式比特位.
. GID设置模式比特位.
. 进程组号.
. 会话ID.
. 控制终端.
. 当前工作目录.
. 根目录.
. 文件创建掩码UMASK.
. 文件长度限制ULIMIT.
. 预定值, 如优先级和任何其他的进程预定参数, 根据种类不同
决定是否可以继承.
. 还有一些其它属性.
但子进程也有与父进程不同的属性:
. 进程号, 子进程号不同与任何一个活动的进程组号.
. 父进程号.
. 子进程继承父进程的文件描述符或流时, 具有自己的一个拷贝
并且与父进程和其它子进程共享该资源.
. 子进程的用户时间和系统时间被初始化为0.
. 子进程的超时时钟设置为0.
. 子进程的信号处理函数指针组置为空.
. 子进程不继承父进程的记录锁.
返回值: 调用成功则对子进程返回0, 对父进程返回子进程号, 这也是
最方便的区分父子进程的方法. 若调用失败则返回-1给父进程,
子进程不生成.
例子:pid_t pid;
if ((pid=fork())>;0) {
/*父进程处理过程*/
}
else if (pid==0) {
/*子进程处理过程*/
exit(0); /*注意子进程必须用exit()退出运行*/
}
else {
printf("fork error/n");
exit(0);
}
2.system()
功能:产生一个新的进程, 子进程执行指定的命令.
语法:#i nclude
#i nclude
int system(string)
char *string;
说明:本调用将参数string传递给一个命令解释器(一般为sh)执行, 即
string被解释为一条命令, 由sh执行该命令.若参数string为一
个空指针则为检查命令解释器是否存在.
该命令可以同命令行命令相同形式, 但由于命令做为一个参数放
在系统调用中, 应注意编译时对特殊意义字符的处理. 命令的查
找是按PATH环境变量的定义的. 命令所生成的后果一般不会对父
进程造成影响.
返回值:当参数为空指针时, 只有当命令解释器有效时返回值为非零.
若参数不为空指针, 返回值为该命令的返回状态(同waitpid())
的返回值. 命令无效或语法错误则返回非零值,所执行的命令被
终止. 其他情况则返回-1.
例子:char command[81];
int i;
for (i=1;i<8;i++) {
sprintf(command,"ps -t tty 02i",i);
system(command);
}
3.exec()
功能:执行一个文件
语法:#i nclude
int execl(path,arg0,...,argn,(char*)0)
char *path,*arg0,...,*argn;
int execv(path,argv)
char *path,*argv[];
int execle(path,arg0,...,argn,(char*)0,envp)
char *path,*arg0,...,*argn,*envp[];
int execve(path,argv,envp)
char *path,*argv[],*envp[];
int execvp(file,argv)
char *file,*argv[];
说明:这是一个系统调用族, 用于将一个新的程序调入本进程所占的内
存, 并覆盖之, 产生新的内存进程映象. 新的程序可以是可执行
文件或SHELL批命令.
当C程序被执行时,是如下调用的:
main(int argc,char *argv[],char *envp[]);
argc是参数个数,是各个参数字符串指针数组,envp是新进程的环
境变量字符串的指针数组.argc至少为1,argv[0]为程序文件名,
所以,在上面的exec系统调用族中,path为新进程文件的路径名,
file为新进程文件名,若file不是全路径名,系统调用会按PATH环
境变量自动找对应的可执行文件运行.若新进程文件不是一个可
执行的目标文件(如批处理文件),则execlp()和execvp()会将该
文件内容作为一个命令解释器的标准输入形成system().
arg0,...等指针指向"/0"结束的字符串,组成新进程的有效参数,
且该参数列表以一个空指针结束.反过来,arg0至少必须存在并指
向新进程文件名或路径名.
同样,argv是字符串指针数组,argv[0]指向新进程文件名或路径
名,并以一空指针结束.
envp是一个字符串指针数组,以空指针结束,这些字符串组成新进
程的环境.
在调用这些系统调用前打开的文件指针对新进程来说也是打开的,
除非它已定义了close-on-exec标志.打开的文件指针在新进程中
保持不变,所有相关的文件锁也被保留.
调用进程设置并正被捕俘的信号在新进程中被恢复为缺省设置,
其它的则保持不变.
新进程启动时按文件的SUID和SGID设置定义文件的UID和GID为有
效UID和GID.
新进程还继承了如下属性:
. 附加GID.
. 进程号.
. 父进程号.
. 进程组号.
. 会话号.
. 控制终端.
. alarm时钟信号剩下的时间.
. 当前工作目录.
. 根目录.
. 文件创建掩码.
. 资源限制.
. 用户时间,系统时间,子进程用户时间,子进程系统时间.
. 记录锁.
. 进程信号掩码.
. 信号屏蔽.
. 优先级.
. 预定值.
调用成功后,系统调用修改新进程文件的最新访问时间.
返回值:该系统调用一般不会有成功返回值, 因为原来的进程已荡然无
存.
例子:printf("now this process will be ps command/n");
execl("/bin/ps","ps","-ef",NULL);
4.popen()
功能:初始化从/到一个进程的管道.
语法:#i nclude
FILE *popen(command,type)
char *command,type;
说明:本系统调用在调用进程和被执行命令间创建一个管道.
参数command做为被执行的命令行.type做为I/O模式,"r"为从被
执行命令读,"w"为向被执行命令写.返回一个标准流指针,做为管
道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或
STDOUT)该系统调用可以用来在程序中调用系统命令,并取得命令
的输出信息或者向命令输入信息.
返回值:不成功则返回NULL,成功则返回管道的文件指针.
5.pclose()
功能:关闭到一个进程的管道.
语法:#i nclude
int pclose(strm)
FILE *strm;
说明:本系统调用用于关闭由popen()打开的管道,并会等待由popen()
激活的命令执行结束后,关闭管道后读取命令返回码.
返回值:若关闭的文件描述符不是由popen()打开的,则返回-1.
例子:printf("now this process will call popen system call/n");
FILE * fd;
if ((fd=popen("ps -ef","r"))==NULL) {
printf("call popen failed/n");
return;
}
else {
char str[80];
while (fgets(str,80,fd)!=NULL)
printf(" s/n",str);
}
pclose(fd);
功能:创建一个新的进程.
语法:#i nclude
#i nclude
pid_t fork();
说明:本系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复
制品. 调用进程叫父进程, 子进程继承了父进程的几乎所有的属
性:
. 实际UID,GID和有效UID,GID.
. 环境变量.
. 附加GID.
. 调用exec()时的关闭标志.
. UID设置模式比特位.
. GID设置模式比特位.
. 进程组号.
. 会话ID.
. 控制终端.
. 当前工作目录.
. 根目录.
. 文件创建掩码UMASK.
. 文件长度限制ULIMIT.
. 预定值, 如优先级和任何其他的进程预定参数, 根据种类不同
决定是否可以继承.
. 还有一些其它属性.
但子进程也有与父进程不同的属性:
. 进程号, 子进程号不同与任何一个活动的进程组号.
. 父进程号.
. 子进程继承父进程的文件描述符或流时, 具有自己的一个拷贝
并且与父进程和其它子进程共享该资源.
. 子进程的用户时间和系统时间被初始化为0.
. 子进程的超时时钟设置为0.
. 子进程的信号处理函数指针组置为空.
. 子进程不继承父进程的记录锁.
返回值: 调用成功则对子进程返回0, 对父进程返回子进程号, 这也是
最方便的区分父子进程的方法. 若调用失败则返回-1给父进程,
子进程不生成.
例子:pid_t pid;
if ((pid=fork())>;0) {
/*父进程处理过程*/
}
else if (pid==0) {
/*子进程处理过程*/
exit(0); /*注意子进程必须用exit()退出运行*/
}
else {
printf("fork error/n");
exit(0);
}
2.system()
功能:产生一个新的进程, 子进程执行指定的命令.
语法:#i nclude
#i nclude
int system(string)
char *string;
说明:本调用将参数string传递给一个命令解释器(一般为sh)执行, 即
string被解释为一条命令, 由sh执行该命令.若参数string为一
个空指针则为检查命令解释器是否存在.
该命令可以同命令行命令相同形式, 但由于命令做为一个参数放
在系统调用中, 应注意编译时对特殊意义字符的处理. 命令的查
找是按PATH环境变量的定义的. 命令所生成的后果一般不会对父
进程造成影响.
返回值:当参数为空指针时, 只有当命令解释器有效时返回值为非零.
若参数不为空指针, 返回值为该命令的返回状态(同waitpid())
的返回值. 命令无效或语法错误则返回非零值,所执行的命令被
终止. 其他情况则返回-1.
例子:char command[81];
int i;
for (i=1;i<8;i++) {
sprintf(command,"ps -t tty 02i",i);
system(command);
}
3.exec()
功能:执行一个文件
语法:#i nclude
int execl(path,arg0,...,argn,(char*)0)
char *path,*arg0,...,*argn;
int execv(path,argv)
char *path,*argv[];
int execle(path,arg0,...,argn,(char*)0,envp)
char *path,*arg0,...,*argn,*envp[];
int execve(path,argv,envp)
char *path,*argv[],*envp[];
int execvp(file,argv)
char *file,*argv[];
说明:这是一个系统调用族, 用于将一个新的程序调入本进程所占的内
存, 并覆盖之, 产生新的内存进程映象. 新的程序可以是可执行
文件或SHELL批命令.
当C程序被执行时,是如下调用的:
main(int argc,char *argv[],char *envp[]);
argc是参数个数,是各个参数字符串指针数组,envp是新进程的环
境变量字符串的指针数组.argc至少为1,argv[0]为程序文件名,
所以,在上面的exec系统调用族中,path为新进程文件的路径名,
file为新进程文件名,若file不是全路径名,系统调用会按PATH环
境变量自动找对应的可执行文件运行.若新进程文件不是一个可
执行的目标文件(如批处理文件),则execlp()和execvp()会将该
文件内容作为一个命令解释器的标准输入形成system().
arg0,...等指针指向"/0"结束的字符串,组成新进程的有效参数,
且该参数列表以一个空指针结束.反过来,arg0至少必须存在并指
向新进程文件名或路径名.
同样,argv是字符串指针数组,argv[0]指向新进程文件名或路径
名,并以一空指针结束.
envp是一个字符串指针数组,以空指针结束,这些字符串组成新进
程的环境.
在调用这些系统调用前打开的文件指针对新进程来说也是打开的,
除非它已定义了close-on-exec标志.打开的文件指针在新进程中
保持不变,所有相关的文件锁也被保留.
调用进程设置并正被捕俘的信号在新进程中被恢复为缺省设置,
其它的则保持不变.
新进程启动时按文件的SUID和SGID设置定义文件的UID和GID为有
效UID和GID.
新进程还继承了如下属性:
. 附加GID.
. 进程号.
. 父进程号.
. 进程组号.
. 会话号.
. 控制终端.
. alarm时钟信号剩下的时间.
. 当前工作目录.
. 根目录.
. 文件创建掩码.
. 资源限制.
. 用户时间,系统时间,子进程用户时间,子进程系统时间.
. 记录锁.
. 进程信号掩码.
. 信号屏蔽.
. 优先级.
. 预定值.
调用成功后,系统调用修改新进程文件的最新访问时间.
返回值:该系统调用一般不会有成功返回值, 因为原来的进程已荡然无
存.
例子:printf("now this process will be ps command/n");
execl("/bin/ps","ps","-ef",NULL);
4.popen()
功能:初始化从/到一个进程的管道.
语法:#i nclude
FILE *popen(command,type)
char *command,type;
说明:本系统调用在调用进程和被执行命令间创建一个管道.
参数command做为被执行的命令行.type做为I/O模式,"r"为从被
执行命令读,"w"为向被执行命令写.返回一个标准流指针,做为管
道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或
STDOUT)该系统调用可以用来在程序中调用系统命令,并取得命令
的输出信息或者向命令输入信息.
返回值:不成功则返回NULL,成功则返回管道的文件指针.
5.pclose()
功能:关闭到一个进程的管道.
语法:#i nclude
int pclose(strm)
FILE *strm;
说明:本系统调用用于关闭由popen()打开的管道,并会等待由popen()
激活的命令执行结束后,关闭管道后读取命令返回码.
返回值:若关闭的文件描述符不是由popen()打开的,则返回-1.
例子:printf("now this process will call popen system call/n");
FILE * fd;
if ((fd=popen("ps -ef","r"))==NULL) {
printf("call popen failed/n");
return;
}
else {
char str[80];
while (fgets(str,80,fd)!=NULL)
printf(" s/n",str);
}
pclose(fd);