IPC机制 共享内存问题
谁给我指点下,一个IPC共享内存的例子子进程向共享内存写入内容,然后退出,父进程等待子进程退出后,从共享内存读入内容,但是这里出现了错误‘‘子进程不知道为何没有执行,直接...
谁给我指点下,一个IPC 共享内存的例子 子进程向共享内存写入内容,然后退出,父进程等待子进程退出后,从共享内存读入内容,但是这里出现了错误‘‘子进程不知道为何没有执行,直接就退出了,用 gdb跟踪发现根本没有进入子进程,而且到父进程报错:
Program received signal SIGSEGV, Segmentation fault.
0x0016e50b in vfprintf () from /lib/tls/i686/cmov/libc.so.6
(gdb)
注:参数在main函数入口给出,为要写入共享内存的字符串
C/C++ code
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
pid_t childpid;
int id;
int i;
int buf[10];
char *ptr;
int totalbytes=0;
if((childpid=fork())==-1)
{
perror("fork");
exit(1);
}
if(childpid==0)
{
if((id=shmget((key_t)12345,50*sizeof(char),IPC_CREAT))==-1)//创建共享内存
{
perror("shmget");
exit(EXIT_FAILURE);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//子进程挂载
{
printf("failed to shmat\n");
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmctl");
exit(1);
}
for(i=0;argv[1][i]!='\0';i++)//写入字符
{
*ptr=argv[1][i];
ptr++;
}
printf("this is child\n,write argv[1] to shm.\nyou input charater count is %d\n",i);
exit(0);
}
else
{
wait(NULL);//等待子进程结束
if((id=shmget((key_t)12345,50*sizeof(char),IPC_CREAT))==-1)//创建共享内存
{
perror("Failed to create sharedm omory segment");
exit(1);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//挂载
{
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmget");
exit(EXIT_FAILURE);
}
printf("this is parent,input charater is %s\n",ptr);//显示内存中的内容
if(shmctl(id,IPC_RMID,NULL)==-1)
{
perror("shmctl");
exit(1);
}
exit(0);
}
} 展开
Program received signal SIGSEGV, Segmentation fault.
0x0016e50b in vfprintf () from /lib/tls/i686/cmov/libc.so.6
(gdb)
注:参数在main函数入口给出,为要写入共享内存的字符串
C/C++ code
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
pid_t childpid;
int id;
int i;
int buf[10];
char *ptr;
int totalbytes=0;
if((childpid=fork())==-1)
{
perror("fork");
exit(1);
}
if(childpid==0)
{
if((id=shmget((key_t)12345,50*sizeof(char),IPC_CREAT))==-1)//创建共享内存
{
perror("shmget");
exit(EXIT_FAILURE);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//子进程挂载
{
printf("failed to shmat\n");
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmctl");
exit(1);
}
for(i=0;argv[1][i]!='\0';i++)//写入字符
{
*ptr=argv[1][i];
ptr++;
}
printf("this is child\n,write argv[1] to shm.\nyou input charater count is %d\n",i);
exit(0);
}
else
{
wait(NULL);//等待子进程结束
if((id=shmget((key_t)12345,50*sizeof(char),IPC_CREAT))==-1)//创建共享内存
{
perror("Failed to create sharedm omory segment");
exit(1);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//挂载
{
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmget");
exit(EXIT_FAILURE);
}
printf("this is parent,input charater is %s\n",ptr);//显示内存中的内容
if(shmctl(id,IPC_RMID,NULL)==-1)
{
perror("shmctl");
exit(1);
}
exit(0);
}
} 展开
1个回答
展开全部
gdb只会调试父进程,默认子进程的代码是无法调试的。如何调试子进程的方法,我就不多讲了,自己上网搜。
你程序的问题主要是创建/使用 shared memory 的时候(shmget),没有指定模式,所以shared memory不可读写。所以只要在shmget中,创建/使用的时候加上可读写的标志即可 (S_IRUSR 创建者可读, S_IWUSR 创建者可写,可以参看 sys/stat.h 或者man shmget来获得更多细节。)
下面是我修改后的代码,另外注意shmat使用后,应该用shmdt来detach.
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
pid_t childpid;
int id;
int i;
int buf[10];
char *ptr;
int totalbytes=0;
if((childpid=fork())==-1)
{
perror("fork");
exit(1);
}
if(childpid==0)
{
if((id=shmget((key_t)12345,50*sizeof(char), IPC_CREAT|S_IRUSR|S_IWUSR))==-1)//创建共享内存
{
perror("shmget");
exit(EXIT_FAILURE);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//子进程挂载
{
printf("failed to shmat\n");
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmctl");
exit(1);
}
for(i=0;argv[1][i]!='\0';i++)//写入字符
{
*ptr=argv[1][i];
ptr++;
}
printf("this is child\n,write argv[1] to shm.\nyou input charater count is %d\n",i);
shmdt(ptr);
exit(0);
}
else
{
wait(NULL);//等待子进程结束
if((id=shmget((key_t)12345,50*sizeof(char),S_IRUSR))==-1)//创建共享内存
{
perror("Failed to create sharedm omory segment");
exit(1);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//挂载
{
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmget");
exit(EXIT_FAILURE);
}
printf("this is parent,input charater is %s\n",ptr);//显示内存中的内容
shmdt(ptr);
if(shmctl(id,IPC_RMID,NULL)==-1)
{
perror("shmctl");
exit(1);
}
exit(0);
}
}
你程序的问题主要是创建/使用 shared memory 的时候(shmget),没有指定模式,所以shared memory不可读写。所以只要在shmget中,创建/使用的时候加上可读写的标志即可 (S_IRUSR 创建者可读, S_IWUSR 创建者可写,可以参看 sys/stat.h 或者man shmget来获得更多细节。)
下面是我修改后的代码,另外注意shmat使用后,应该用shmdt来detach.
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
pid_t childpid;
int id;
int i;
int buf[10];
char *ptr;
int totalbytes=0;
if((childpid=fork())==-1)
{
perror("fork");
exit(1);
}
if(childpid==0)
{
if((id=shmget((key_t)12345,50*sizeof(char), IPC_CREAT|S_IRUSR|S_IWUSR))==-1)//创建共享内存
{
perror("shmget");
exit(EXIT_FAILURE);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//子进程挂载
{
printf("failed to shmat\n");
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmctl");
exit(1);
}
for(i=0;argv[1][i]!='\0';i++)//写入字符
{
*ptr=argv[1][i];
ptr++;
}
printf("this is child\n,write argv[1] to shm.\nyou input charater count is %d\n",i);
shmdt(ptr);
exit(0);
}
else
{
wait(NULL);//等待子进程结束
if((id=shmget((key_t)12345,50*sizeof(char),S_IRUSR))==-1)//创建共享内存
{
perror("Failed to create sharedm omory segment");
exit(1);
}
if((ptr=(char *)shmat(id,NULL,0))==NULL)//挂载
{
if(shmctl(id,IPC_RMID,0)==-1)
perror("shmget");
exit(EXIT_FAILURE);
}
printf("this is parent,input charater is %s\n",ptr);//显示内存中的内容
shmdt(ptr);
if(shmctl(id,IPC_RMID,NULL)==-1)
{
perror("shmctl");
exit(1);
}
exit(0);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询