免费注册 查看新帖 |

Chinaunix

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

关于共享存储的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-10 15:48 |只看该作者 |倒序浏览
共享存储的问题!!
  1. #define PERM S_IRUSR|S_IWUSR
  2. int main(int argc,char **argv)
  3. {
  4.    int shmid;
  5.    char *p_addr,*c_addr;
  6.    if(argc!=2)
  7.    {
  8.       fprintf(stderr,"Usage: %s\n\a",argv[0]);
  9.       exit(1);
  10.    }
  11.    if(fork())
  12.    {
  13.       p_addr=shmat(shmid,0,0);
  14.       memset(p_addr,'\0',1024);
  15.       strncyp(p_addr,argv[1],1024);
  16.    }
  17.    else
  18.    {
  19.       c_addr=shmat(shmid,0,0);
  20.       printf("Client get %s",c_addr);
  21.       exit(0);
  22.    }
  23.    shmctl(shmid,IPC_RMID,0);
  24.    exit(0);
  25. }
复制代码


其中父进程将argv[1]写入共享区中,子进程打印出这个argv[1],不过每次编译只能够显示Client get,后面无值??
如果让子进程将argv[1]写入共享区中,父进程打印出这个argv[1],试验是成功的,不知道为什么??

论坛徽章:
0
2 [报告]
发表于 2006-05-10 20:48 |只看该作者
你都给IPC_RMID掉了,子进程没崩溃就算万幸(其实是更加不幸)。
在RMID之前wait一下。

论坛徽章:
0
3 [报告]
发表于 2006-05-10 23:17 |只看该作者
我把shmctl(shmid,IPC_RMID,0);去掉了,即不销毁信号量,可是问题还是一样的!!???

论坛徽章:
0
4 [报告]
发表于 2006-05-11 07:01 |只看该作者
两个进程没有同步,所以可能在父进程将内容写入共享区之前子进程已经尝试输出了。

论坛徽章:
0
5 [报告]
发表于 2006-05-11 09:44 |只看该作者
那就是说要加一个信号量,父进程得到信号量,然后子进程等待,直到父进程完成写入??

还有如果设置信号量,怎么能确定一定是父进程先得到信号量??

还有为什么让子进程将argv[1]写入共享区中,父进程打印出这个argv[1],试验是成功的??

论坛徽章:
0
6 [报告]
发表于 2006-05-11 09:52 |只看该作者
根本没有创建共享内存区的语句,能正常才怪

论坛徽章:
0
7 [报告]
发表于 2006-05-11 10:05 |只看该作者
原帖由 isnowran 于 2006-5-11 09:52 发表
根本没有创建共享内存区的语句,能正常才怪


呵呵,
还是兄台看的仔细.

论坛徽章:
0
8 [报告]
发表于 2006-05-11 15:40 |只看该作者
原帖由 isnowran 于 2006-5-11 09:52 发表
根本没有创建共享内存区的语句,能正常才怪


汗一下自己……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP