Linux操作系统之进程通信——利用共享存储区实现SERVER和 CLIENT的通信
2018-10-13 15:00
323 查看
实现思路如下:
- 用fork( )创建子进程,利用共享存储区实现SERVER和 CLIENT的通信
- SERVER建立一个KEY为75的共享区: 若共享区的第一个字节为-1 ,则表示空闲。
若共享区的第一个字节为-1 ,则表示空闲。
- 若该字节值发生变化,则表示收到了消息,读取后再次把值设为-1。
- SERVER每接收到一次数据后显示“(server)received”。
- 若遇到的值为0,则视为结束信号,取消该队列,并退出。
- CLIENT端建立一个为75的共享区:
- 若共享区的第一个字节为-1, 则表示该单元空闲,可发送请求
- CLIENT 随即填入9到0,期间等待Server端再次空闲。
- CLIENT每发送一次数据后显示“ (client)sent”。
- 进行完这些操作后, CLIENT退出。
详细代码如下:
[code]#include<sys/types.h> #include<sys/msg.h> #include<sys/ipc.h> #define SHMKEY 75 /*定义共享区关键词*/ void CLIENT() { int shmid,i; int *addr; shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT); /*获取共享区,长度1024,关键词SHMKEY*/ addr=shmat(shmid,0,0); /*共享区起始地址为addr*/ for(i=9;i>=0;i--) { while(*addr!= -1); printf("(client)sent\n"); *addr=i; /*把i赋给addr*/ } exit(0); } void SERVER() { int shmid; int *addr; shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享区*/ addr=shmat(shmid,0,0); /*共享区起始地址为addr*/ *addr=-1; do { while(*addr ==-1); printf("(server)received\n%d",*addr); if(*addr!=0) *addr=-1; } while(*addr!=0); wait(0); shmctl(shmid,IPC_RMID,0); } void main() { if(fork()) { SERVER(); }else { CLIENT(); } }
END
阅读更多相关文章推荐
- Linux操作系统之进程通信——使用消息缓冲队列实现client进程与server进程之间的通信
- 利用共享存储实现父子进程间的通信
- linux下通过共享内存在进程之间实现通信(system V)
- [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令 - 雪山之巅的阳光 - 博客园
- Linux下共享内存通信实现A进程死循环输出A后被C进程处理输出C
- 通过共享内存,利用循环队列实现两个进程A,B之间的通信
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- Linux进程共享通信 -- mmap实现
- Linux进程通信---共享内存 代码实现
- linux中利用有名管道实现进程之间的通信
- 进程通信之内存地址映射与共享,同时如何在Linux0.11下实现共享内存
- [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令
- linux编程---进程通信中,利用socketpair实现子进程间通信
- 数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令
- 在 Linux 上实现基于 Socket 的多进程实时通信
- linux 进程通信——C语言实现
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- 利用socket实现vc++与.NET进程间的通信
- putty+guttygen实现远程自动登录(包括Linux Client + Server)
- linux 进程间的通信(五) 共享内存-2