进程间通信:共享内存Shmem.c分析

                     Shmem分析

源代码加注释:


点击(此处)折叠或打开

  1. #include <stdlib.h> //exit()
  2. #include <stdio.h> //printf()
  3. #include <string.h> //memset()
  4. #include <errno.h> //errno
  5. #include <unistd.h> //sleep()
  6. #include <sys/stat.h> // S_IRUSR|S_IWUSR
  7. #include <sys/types.h> //不知道什么用
  8. #include <sys/ipc.h> //不知道什么用
  9. #include <sys/shm.h> //shmget() shmat()

  10. #define PERM S_IRUSR|S_IWUSR // PERM <===> S_IRUSR|S_IWUSR
  11. /* 共享内存 */

  12. int main(int argc,char **argv) //char **argv:指向指针的指针 《C书》P271(下:详)
  13. {
  14.     int shmid; //共享内存ID
  15.     char *p_addr,*c_addr; //初始化 内存实际地址(《UNIX书》上这么说的)
  16.     
  17.     if(argc!=2) //判断入参
  18.     {
  19.         fprintf(stderr,"Usage:%s\n\a",argv[0]); //入参不是2就打印出使用方法
  20.         exit(1);
  21.     }

  22.     /* 创建共享内存 */    
  23.     if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
  24.     {
  25.      fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));//创建共享内存失败信息
  26.         exit(1);
  27.     }

  28.     /* 创建子进程 */
  29.     if(fork()) // 父进程写 //fork()返回值:子进程返回0,父进程中返回子ID
  30.     { //子进程ID不可能为负 这样写更容易理解:
  31.                                     // if(fork()>0)
  32.         p_addr=shmat(shmid,0,0); //共享内存的第二步:映射共享内存
  33.         memset(p_addr,'\0',1024); //格式化内存(下详解)
  34.         strncpy(p_addr,argv[1],1024); //写入数据(下详解)
  35.         wait(NULL); // 释放资源,不关心终止状态(父停让子运行,等待子运行完毕)
  36.         exit(0);
  37.     }
  38.     else // 子进程读 ( ”else” 也可以用 ”if(fork()=0)” )
  39.     {
  40.         sleep(1); // 暂停1秒         (假若子先运行了,自觉停让父运行到wai())
  41.         c_addr=shmat(shmid,0,0); //这时候共享内存中已有数据,子映射共享内存
  42.         printf("Client get %s\n",c_addr); //打印出映射出的内容,
  43.         exit(0);
  44.     }
  45. }

 char **argv(以下是谭老师原文)

 

 

memset(p_addr,'\0',1024)

 

p_addr1024个字节替换为“\0,并返回p_addr(本函数没有取其返回值,因为没有发生变化)

 

strncpy(p_addr,argv[1],1024)

 

argv[1]处最多1024个字符复制到字符数组的p_addr中,返回指向p_addr的指针。(本函数也没有取其返回值,因为不需要,只要共享内存中有数据即可)

 

运行结果:

阅读(483) | 评论(0) | 转发(0) |
评论热议
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值