您的位置:首页 > 运维架构 > Linux

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐