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

Unix 多进程编程

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

. 共享内存
通过共享内存key值定义和生成共享内存.
任何进程只要有访问权限并知道key即可访问共享内存.
共享内存为内存块方式的数据段.
共享内存中的数据长度可为系统参数限制内的任何长度.
共享内存的访问同数组的访问方式相同.
在取得共享内存标识符将共享内存和进程数据段联接后即可开始对
之进行读写操作,在任何操作完成之后再做共享内存和进程数据
段脱离操作,才完成全部共享内存访问过程.
共享内存中的数据不会因数据被进程读取后消失.
共享内存的访问不具备锁机制处理,即多个进程可能同时访问同一
个共享内存的同一个数据单元.
共享内存的使用最好和信号量一起操作,以具备锁机制,确保数据的
一致.
在权限允许时,共享内存的信息传递是双向的.
. 信号量
用于生成锁机制,避免发生数据不一致.
没有其他的数据信息.
无需有父子关系或兄弟关系.
. 信号
信号由系统进行定义.
信号的发送只要有权限即可进行.
信号是个事件发生的信息标志,不带有其他信息.
信号不具备数据块.
信号的处理可由用户自己定义.
信号可能由用户进程,操作系统(软件或硬件原因)等发出.
有一些信号是不可被屏蔽的.
信号中断的是系统调用级的函数.
信号的信息传递是单向的.
. 管道
做为系统的特别设备文档,能够是内存方式的,也能够是外存方式的.
管道的传输一般是单向的,即一个管道一向,若两个进程要做双向传
输则需要2个管道.管道生成时即有两端,一端为读,一端为写,两个
进程要协调好,一个进程从读方读,另一个进程向写方写.
管道的读写使用流设备的读写函数,即:read(),write.
管道的传输方式为FIFO,流方式的.不象消息队列能够按类型读取.
* 有名管道
一般为系统特别文档方式,使用的进程之间不一定要有父子关系
或兄弟关系.
* 无名管道
一般为内存方式,使用的进程之间一定要有父子关系或兄弟关系.
. 文档
文档是最简单的进程间通讯方式,使用外部存贮器为中介.
操作麻烦,定位困难.
保密程度低.
容易出现数据不一致问题.
占用硬盘空间.
只要有权限并知道文档名,任何进程都可对之操作.
* 特别处理
为避免出现保密问题,在打开文档,取得文档描述符后,调用
unlink()将硬盘上的文档路径名删除,则硬盘上就没有文档拷贝
了.但在进程中该文档描述符是打开的,由该进程生成的子进程中
该文档描述符也是打开的,就能够利用系统提供的文档缓冲区做
进程间通讯,代价是进程间必须有父子关系或兄弟关系.
. 环境变量
信息的传送一般是单向的,即由父进程向子进程传送.
保密性较好.
双方必须约定环境变量名.
只占用本进程和子进程的环境变量区.
. 共享数据段
操作比较复杂.
占用硬盘空间,生成系统特别文档.
其他性质和共享内存相类似.
. 流
文档描述符的操作方式.
进程间不一定要有父子关系或兄弟关系.
双向传送信息.
进程各自生成socket,用bind()联接.
其他性质和管道相类似.
流编程为TCP/IP网络编程范围,在本文中暂不阐述.
. 传递参数
信息的传送一般是单向的, 即由父进程向子进程传送.
保密性较差,用进程列表即可显示出来.
双方必须约定参数位置.
只占用子进程的参数区.

answer 回复于:2003-02-07 21:02:45
奥!
赞了这么好的东西,为什么早不拿出来。

htldm 回复于:2003-02-07 21:06:24
不晚呀!呵呵。

delayerking 回复于:2003-02-08 02:15:28
hao

午夜聆听 回复于:2003-02-08 08:43:51
偶是编程外行。但偶觉得看了此帖长知识。建议此帖为精华。

kinks 回复于:2003-04-20 22:33:37
好东东,收藏

fsjhcmc 回复于:2003-05-29 23:50:31
好的东西奥!已收藏!谢谢!

lannum 回复于:2003-06-29 10:20:14
好好,,偶已收藏好了

zhouyifeng 回复于:2003-08-27 15:10:25
[code:1:e3972e77ee] #include
#include
#include
#define SEMKEY 75
int semid;
unsigned int count;
/*在文档sys/sem.h中定义的sembuf结构
* struct sembuf {
* unsigned short sem_num;
* short sem_op;
* short sem_flg;
* }*/
struct sembuf psembuf,vsembuf; /*P和V操作*/
cleanup()
{
semctl(semid,2,IPC_RMID,0);
exit(0);
}
main(argc,argv)
int argc;
char *argv[];
{
int i,first,second;
short initarray[2],outarray[2];
extern cleanup();
if (argc==1) {
for (i=0;i<20;i )
signal(i,clearup);
semid=semget(SEMKEY,2,0777|IPC_CREAT);
initarray[0]=initarray[1]=1;
semctl(semid,2,SETALL,initarray);
semctl(semid,2,GETALL,outarray);
printf("sem init vals %d%d \n",
outarray[0],outarray[1]);
pause(); /*睡眠到被一软件中断信号唤醒*/
}
else if (argv[1][0]=='a') {
first=0;
second=1;
}
else {
first=1;
second=0;
}
semid=semget(SEMKEY,2,0777);
psembuf.sem_op=-1;
psembuf.sem_flg=SEM_UNDO;
vsembuf.sem_op=1;
vsembuf.sem_flg=SEM_UNDO;
for (count=0;;xcount ) {
psembuf.sem_num=first;
semop(semid,&psembuf,1);
psembuf.sem_num=second;
semop(semid,&psembuf,1);
printf("proc %d count %d\n",getpid(),count);
vsembuf.sem_num=second;
semop(semid,&vsembuf,1);
vsembuf.sem_num=first;
semop(semid,&vsembuf,1);
}
} [/code:1:e3972e77ee]
楼主能说说semid=semget(SEMKEY,2,0777);这一句为什么不要0777|IPC_CREAT?

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