memset的使用
网友的一个关于shmget例子,执行之后会出现segment fault的错误,经检查是memset的使用不正确,在此作修正。
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #define PERM S_IRUSR|S_IWUSR
- /* 共享内存 */
- int main(int argc,char **argv)
- {
- int shmid;
- char *p_addr,*c_addr;
-
- if(argc!=2)
- {
- fprintf(stderr,"Usage:%s\n\a",argv[0]);
- exit(1);
- }
- /* 创建共享内存 */
- if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
- {
- fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
- exit(1);
- }
- /* 创建子进程 */
- if(fork()) // 父进程写
- {
- p_addr=shmat(shmid,0,0);
- memset(&p_addr,'\0',1024);
- strncpy(p_addr,argv[1],1024);
- wait(NULL); // 释放资源,不关心终止状态
- exit(0);
- }
- else // 子进程读
- {
- sleep(1); // 暂停1秒
- c_addr=shmat(shmid,0,0);
- printf("Client get %s\n",c_addr);
- exit(0);
- }
- }
memset的第一个参数搞错了,不需要加取地址符。
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #include<errno.h>
- #include<unistd.h>
- #include<sys/stat.h>
- #include<sys/types.h>
- #include<sys/wait.h>
- #include<sys/ipc.h>
- #include<sys/shm.h>
- #define MAL_SIZE 4096
- #define PERM S_IRUSR|S_IWUSR
- int main(int argc,char **argv)
- {
- int shmid;
- char *p_addr,*c_addr;
-
- if(argc!=2)
- {
- fprintf(stderr,"usage:%s\n\a",argv[0]);
- exit(1);
- }
- if((shmid=shmget(IPC_PRIVATE,MAL_SIZE,PERM))==-1)
- {
- fprintf(stderr,"create share memory error:%s\n\a",strerror(errno));
- exit(1);
- }
- if(fork())
- {
- p_addr=(char *)shmat(shmid,0,0);
- if( p_addr == NULL )
- printf("parent process creat virtual addr error!\n");
- memset(p_addr,'\0',MAL_SIZE);
- strncpy(p_addr,argv[1],MAL_SIZE);
-
- wait(NULL);
- shmdt(p_addr);
- exit(0);
- }
- else
- {
- sleep(1);
- c_addr=(char *)shmat(shmid,0,0);
- if( c_addr == NULL )
- printf("child process creat virtual addr error!\n");
-
- printf("client get: %s\n",c_addr);
- shmdt(c_addr);
- exit(0);
- }
- }
阅读(1524) | 评论(1) | 转发(0) |