. 共享内存
通过共享内存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?
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |




