手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Unix 多进程编程

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

说明:这是个系统调用族, 用于将一个新的程式调入本进程所占的内
存, 并覆盖之, 产生新的内存进程映象. 新的程式能够是可执行
文档或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()
功能:初始化从/到一个进程的管道.
语法:#include
FILE *popen(command,type)
char *command,type;
说明:本系统调用在调用进程和被执行命令间创建一个管道.
参数command做为被执行的命令行.type做为I/O模式,"r"为从被
执行命令读,"w"为向被执行命令写.返回一个标准流指针,做为管
道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或
STDOUT)该系统调用能够用来在程式中调用系统命令,并取得命令
的输出信息或向命令输入信息.
返回值:不成功则返回NULL,成功则返回管道的文档指针.
5.pclose()
功能:关闭到一个进程的管道.
语法:#include
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);
6.wait()
功能:等待一个子进程返回并修改状态
语法:#include
#include
pid_t wait(stat_loc)
int *stat_loc;
说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其
一个子进程终止.
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为
-1.同时stat_loc返回子进程的返回值.
例子:/*父进程*/
if (fork()>0) {
wait((int *)0);
/*父进程等待子进程的返回*/
}
else {
/*子进程处理过程*/
exit(0);
}
7.waitpid()
功能:等待指定进程号的子进程的返回并修改状态
语法:#include
#include
pid_t waitpid(pid,stat_loc,options)
pid_t pid;
int *stat_loc,options;
说明:当pid等于-1,options等于0时,该系统调用等同于wait().否则该
系统调用的行为由参数pid和options决定.
pid指定了一组父进程需要知道其状态的子进程:
-1:需要知道任何一个子进程的返回状态.
>0:需要知道进程号为pid值的子进程的状态.
<-1:需要知道进程组号为pid的绝对值的子进程的状态.
options参数为以比特方式表示的标志以或运算组成的位图,每个
标志以字节中某个比特置1表示:
WUNTRACED:报告任何未知而又已停止运行的指定进程号的子进
程的状态.该子进程的状态自停止运行时起就没有被报告
过.
WCONTINUED:报告任何继续运行的指定进程号的子进程的状态,
该子进程的状态自继续运行起就没有被报告过.
WHOHANG:若调用本系统调用时,指定进程号的子进程的状态目
前并不是立即有效的(即可被立即读取的),调用进程并被
暂停执行.
WNOWAIT:保持将其状态配置在stat_loc的进程在可等待状态.
该进程将等待直到下次被需要其返回状态值.
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为
-1.同时stat_loc返回子进程的返回值.
例子:pid_t pid;
int stat_loc;
/*父进程*/
if ((pid=fork())>0) {
waitpid(pid,&stat_loc,0);
/*父进程等待进程号为pid的子进程的返回*/
}
else {
/*子进程的处理过程*/
exit(1);
}
/*父进程*/
printf("stat_loc is [%d]\n",stat_loc);
/*字符串"stat_loc is [1]"将被打印出来*/
8.setpgrp()
功能:配置进程组号和会话号.
语法:#include
pid_t setpgrp()
说明:若调用进程不是会话首进程.将进程组号和会话号都配置为和他

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!