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

Unix 多进程编程

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

int sdenter(addr,flags)
char *addr;
int flags;
说明:用于指示调用进程即将能够访问共享数据段中的内容.
参数addr为将一个sdget()调用的有效返回码.
所执行的动作取决于flags的值:
. SD_NOWAIT:若另一个进程已对指定的段调用本系统调用且还没
有调用sdleave(),并且该段并非用SD_UNLOCK标志创建,则调
用进程不是等待该段空闲而是立即返回错误码.
. SD_WRITE:指示调用进程希望向共享数据段写数据.此时,另一
个进程用SD_RDONLY标志联接该共享数据段则不被允许.
返回值:调用成功则返回0,否则返回-1.
25.sdleave()
功能:共享数据段同步访问,解锁.
语法:#include
int sdleave(addr,flags)
char *addr;
说明:用于指示调用进程已完成修改共享数据段中的内容.
返回值:调用成功则返回0,否则返回-1.
26.sdget()
功能:联接共享数据段到调用进程的数据空间中.
语法:#include
char *sdget(path,flags,size.mode)
char *path;
int flags;
long size;
int mode;
说明:本系统调用将共享数据段联接到调用进程的数据段中,具体动作
由flags的值定义:
. SD_RDONLY:联接的段为只读的.
. SD_WRITE:联接的段为可读写的.
. SD_CREAT:若由path命名的段存在且不在使用中,本标志的作用
同早先创建一个段相同,否则,该段根据size和mode的值进程
创建.对段的读写访问权限的授予基于mode给的权限,功能和
一般文档的相同.段被初始化为全0.
. SD_UNLOCK:若用此标志创建该段,则允许有多个进程同时访问
(在读写中)该段.
返回值:若调用成功则返回联接的段地址.否则返回-1.
27.sdfree()
功能:将共享数据段从调用进程的数据空间中断开联接.
语法:#include
int sdfree(addr)
char *addr;
说明:本系统调用将共享数据段从调用进程的数据段的指定地址中分离.
若调用进程已完成sdenter()的调用,还未调用sdleave()就调用
本系统调用,则sdleave()被自动调用,然后才做本调用的工作.
返回值:若调用成功则返回联接的段地址.否则返回-1.
28.sdgetv()
功能:同步共享数据访问.
语法:#include
int sdgetv(addr)
char *addr;
说明:用于同步协调正在使用共享数据段的进程.返回值为共享数据段
的版本号.当有进程对该段做sdleave()操作时,版本号会被修改.
返回值:若调用成功,则返回指定共享数据段的版本号,否则返回-1.
29.sdwaitv()
功能:同步共享数据访问.
语法:#include
int sdwaitv(addr,vnum)
char *addr;
int vnum;
说明:用于同步协调正在使用共享数据段的进程.返回值为共享数据段
的版本号.调用进程会睡眠直到指定段的版本号不再等于vnum;
返回值:若调用成功,则返回指定共享数据段的版本号,否则返回-1.
30.sbrk()
功能:修改数据段空间分配.
语法:char *sbrk(incr)
int incr;
说明:用于动态修改调用进程数据段的空间分配.进程将重置进程的分
段值并分配一个合适大小的空间.分段值为数据段外第一次分配
的地址.要分配的空间的增加量等于分段值的增加量.新分配的空
间配置为0.若相同的内存空间重新分配给同一个进程,则空间的
内容不确定.
返回值:若成功调用则返回值为0,否则返回-1.
例子:本例将包括上述共享数据空间操作的任何系统调用:
char * area1;
char buf[21];
int v;
/*取得或创建一个共享数据空间(系统特别文档),名字为
/tmp/area1,长度为640,用户访问权限为0777*/
area1=sdget("/tmp/area1",SD_WRITE|SD_CREAT,640,0777);
if ((int)area1==-1) {
printf("get share data segment area1 failed\n");
exit(1);
}
/*取得共享数据段area1的版本号*/
v=sdgetv(area1);
/*申请访问共享数据段area1,若已有进程在访问该段则本进程挂
*起,否则进入访问并将该数据段加写锁*/
sdenter(area1,SD_WRITE);
/*对共享数据段访问,写10个a*/
strcpy(area1,"aaaaaaaaaa");
/*申请解除访问权限,若已有进程申请访问则激活该进程*/
sdleave(area1);
/*进程处理过程*/
/*等待取共享数据段area1的版本号*/
sdwaitv(area1,v);
/*重新申请访问共享数据段area1*/
sdenter(area1,SD_WRITE);
/*读取共享数据段中的数据*/
memcpy(buf,area1,20);
/*申请解除访问权限,若已有进程申请访问则激活该进程*/
sdleave(area1);
printf("the data now in area1 is [%s]\n",buf);
31.getenv()
功能:取得指定环境变量值.
语法:#include
#include char *getenv(name)
char *name;
说明:本系统调用检查环境字符串(格式如name=value),并在找到有指
定名字的环境值后,返回指向value字符串的指针.否则返回空指
针.
返回值:如前述.
例子:char * value;
value=getenv("HOME");
printf("HOME = [%s]\n",value);
/*将打印出HOME环境变量的值*/
32.putenv()
功能:修改或增加环境值.
语法:#include
int putenv(string)
char *string;
说明:参数string指向一个字符串,格式如下:
name=value
本系统调用将环境变量name等于值value,修改或增加一个环境变
量,字符串string成为环境的一部分.
返回值:若putenv()不能取得合适的内存空间则返回非0值,否则返回0.
例子:/*父进程处理*/
putenv("HOME=/home/abcdef");
putenv("PATH=/bin");
if (fork()>0)
exit(0); /*父进程退出运行*/
/*子进程处理*/
setpgrp();
/*父进程配置的环境变量已传到子进程*/
char * value1;
value1=getenv("HOME");
value2=getenv("PATH");
printf("HOME=[%s],PATH=[%s]\n",value1,value2);
/*将打印出"HOME=/home/abcdef"和"PATH=/bin"*/

三.多进程编程技巧
1.主要程式结构
(1)事件主控方式
若是应用程式属于事务处理方式,则在主函数中设计为监控事件发生,
当事件发生时,能够生成一个新的进程来处理该事务,事务处理完成后就

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