Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3950762
  • 博文数量: 366
  • 博客积分: 9916
  • 博客等级: 中将
  • 技术积分: 7195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-29 23:27
个人简介

简单!

文章分类

全部博文(366)

文章存档

2013年(51)

2012年(269)

2011年(46)

分类: LINUX

2011-08-07 17:51:16

                                      memset的使用
 
     网友的一个关于shmget例子,执行之后会出现segment fault的错误,经检查是memset的使用不正确,在此作修正。
 
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <sys/stat.h>
  7. #include <sys/types.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>

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

  12. int main(int argc,char **argv)
  13. {
  14.     int shmid;
  15.     char *p_addr,*c_addr;
  16.     
  17.     if(argc!=2)
  18.     {
  19.         fprintf(stderr,"Usage:%s\n\a",argv[0]);
  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()) // 父进程写
  30.     {
  31.         p_addr=shmat(shmid,0,0);
  32.         memset(&p_addr,'\0',1024);
  33.         strncpy(p_addr,argv[1],1024);
  34.         wait(NULL); // 释放资源,不关心终止状态
  35.         exit(0);
  36.     }
  37.     else // 子进程读
  38.     {
  39.         sleep(1); // 暂停1秒        
  40.         c_addr=shmat(shmid,0,0);
  41.         printf("Client get %s\n",c_addr);
  42.         exit(0);
  43.     }
  44. }
memset的第一个参数搞错了,不需要加取地址符。
 
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<unistd.h>
  6. #include<sys/stat.h>
  7. #include<sys/types.h>
  8. #include<sys/wait.h>
  9. #include<sys/ipc.h>
  10. #include<sys/shm.h>

  11. #define MAL_SIZE 4096
  12. #define PERM S_IRUSR|S_IWUSR

  13. int main(int argc,char **argv)
  14. {
  15.         int shmid;
  16.         char *p_addr,*c_addr;
  17.         
  18.         if(argc!=2)
  19.         {
  20.             fprintf(stderr,"usage:%s\n\a",argv[0]);
  21.             exit(1);
  22.         }

  23.         if((shmid=shmget(IPC_PRIVATE,MAL_SIZE,PERM))==-1)
  24.         {
  25.             fprintf(stderr,"create share memory error:%s\n\a",strerror(errno));
  26.             exit(1);
  27.         }

  28.         if(fork())
  29.         {
  30.             p_addr=(char *)shmat(shmid,0,0);
  31.             if( p_addr == NULL )
  32.                 printf("parent process creat virtual addr error!\n");
  33.             memset(p_addr,'\0',MAL_SIZE);
  34.             strncpy(p_addr,argv[1],MAL_SIZE);
  35.             
  36.             wait(NULL);
  37.             shmdt(p_addr);
  38.             exit(0);
  39.         }
  40.         else
  41.         {
  42.             sleep(1);
  43.             c_addr=(char *)shmat(shmid,0,0);
  44.             if( c_addr == NULL )
  45.                 printf("child process creat virtual addr error!\n");
  46.             
  47.             printf("client get: %s\n",c_addr);
  48.             shmdt(c_addr);
  49.             exit(0);
  50.         }
  51. }
阅读(1435) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

txgc_wm2011-08-07 17:59:41

http://wenku.baidu.com/view/6cdd07791711cc7931b716ce.html
本文章对于segment fault的分析,写的很好!