免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4548 | 回复: 5
打印 上一主题 下一主题

进程间利用共享内存实现进程通信 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-28 10:31 |只看该作者 |倒序浏览
下面的代码是在flw兄写的代码修改而得,进程1写入数据到buffer,进程2读出来,并对进程1的数据回答,请教进程1如何去读取进程2的回答?如何处理shmwrite?

进程1: //shmwrite
#include<sys/types.h>;
#include<sys/ipc.h>;
#include<sys/shm.h>;
#include<stdlib.h>;
#include<stdio.h>;
#include<string.h>;
#include<openssl/buffer.h>;

int main(void){
  key_t key;
  int shmid;
  pid_t pid;
  int ret;
  char string[100];
  char *shmbuf;
  char buffer[100];

  key = ftok("/",'J');
  if(key == -1){
    fprintf(stderr,"ftok() failed!\n";
    exit(1);
  }
shmid = shmget(key,1024,IPC_CREAT|0666);
  if(shmid == -1){
    fprintf(stderr,"shmget() failed!\n";
    exit(1);
  }
  shmbuf = NULL;
  shmbuf = shmat(shmid,NULL,0);
  if(shmbuf == NULL){
    fprintf(stderr,"Attach shm failed!\n";
    exit(1);
  }
  pid = fork();
  if(pid == -1){
    fprintf(stderr,"fork() failed!";
  }
  if(pid >; 0){
     printf("           /*共享内存实现进程通信*/\n";
     bzero(buffer,100);
     printf("please write data to shm:";
     scanf("%s",&buffer);
     strcpy(shmbuf,buffer);
     fprintf(stderr,"shm write success!\n";
  }
  ret = shmdt(shmbuf);
  if(ret == -1){
    fprintf(stderr,"shmdt failed!\n";
    exit(1);
  }
  exit(1);
}

进程2: //shmread

#include<sys/shm.h>;
#include<sys/ipc.h>;
#include<sys/types.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<string.h>;

int main(void){
  key_t key;
  int shmid;
  pid_t pid;
  int ret;
  char string[100];
  char *shmbuf;
  char buffer[100];

  key = ftok("/",'J');
  if(key == -1){
    fprintf(stderr,"ftok() failed!\n";
    exit(1);
  }
  shmid = shmget(key,1024,0666);
  if(shmid == -1){
    fprintf(stderr,"shmget() failed!\n";
    exit(1);
  }
  shmbuf = NULL;
  shmbuf = shmat(shmid,NULL,SHM_RDONLY);
  if(shmbuf == NULL){
    fprintf(stderr,"Attach shm failed!\n");
    exit(1);
  }
  pid = fork();
  if(pid == -1){
    fprintf(stderr,"fork() failed!");
  }
  if(pid >; 0){
    printf("                    /*共享内存实现进程通信!*/\n");
    strcpy(buffer,shmbuf);
    fprintf(stderr,"Read data from shm...\n");
    fprintf(stderr,"Read data:\t%s\n",buffer);
    fprintf(stderr,"Read data success!\n");
    bzero(buffer,100);
    fprintf(stderr,"answer the request: ");
    scanf("%s",&buffer);
    strcpy(buffer,shmbuf);
    fprintf(stderr,"answer success!\n");
  }
ret = shmdt(shmbuf);
if(ret == -1){
   fprintf(stderr,"shmdt failed!\n");
   exit(1);
  }
shmctl(shmid,IPC_RMID,NULL);
exit(1);
}

论坛徽章:
0
2 [报告]
发表于 2003-05-28 11:44 |只看该作者

进程间利用共享内存实现进程通信

flw的这个程序只是为了向你示意一下shm的典型用法而已,别照搬代码。因为这个代码是不安全的,有可能产生“生产者-消费者”问题,发生racing-condition。因为shm只能通信,不能实现同步。

论坛徽章:
0
3 [报告]
发表于 2003-05-28 12:20 |只看该作者

进程间利用共享内存实现进程通信

你对利用共享内存实现进程通信有什么看法?

论坛徽章:
0
4 [报告]
发表于 2003-05-28 12:25 |只看该作者

进程间利用共享内存实现进程通信

你有解决这么问题的办法吗?大家有什么高招,请指教!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-05-28 12:40 |只看该作者

进程间利用共享内存实现进程通信

普及到同步问题,需要一些机制,例如信号量,mutex,filesystem,record locking等。

在ipc sample中有semaphore的用法示例。仅供参考,不可照搬!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2003-05-28 13:57 |只看该作者

进程间利用共享内存实现进程通信

[quote]原帖由 "JohnBull"]flw的这个程序只是为了向你示意一下shm的典型用法而已,别照搬代码。[/quote 发表:

知我者,JohnBull 也!


共享内存在编程的时候通常只用来传递数据,至于进程间同步,应以信号量为佳。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP