我已将以下程序编写为共享内存示例。我想从write.c文件中创建的共享内存中写一些消息,并希望在同一内存中的read.c进程中显示它。但是当我尝试运行程序时,我收到错误消息:
Segmentation fault (core dumped)
已尝试但无法在我的代码中找到错误。
write.c文件:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
main() {
key_t key=1235;
int shm_id;
void *shm;
char *message = "hello";
shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
shm = shmat(shm_id,NULL,NULL);
sprintf(shm,"%s",message);
}
read.c文件:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
main() {
key_t key=1235;
int shm_id;
void *shm;
char *message;
message = malloc(10*sizeof(char));
shm_id = shmget(key,10*sizeof(char),NULL);
shm = shmat(shm_id,NULL,NULL);
if(shm == NULL)
{
printf("error");
}
sscanf(shm,"%s",message);
printf("\n message = %s\n",message);
}
答案 0 :(得分:1)
这不是sprintf的问题。这是一个权限问题,您无权附加刚刚创建的细分受众群。当我运行你的&#34;写&#34;程序作为普通用户,shmat失败并返回-1,然后sprintf当然崩溃。 shmat还将errno设置为13(&#34; Permission denied&#34;)。当我以root身份运行时,它可以工作。
尝试使用此功能(并使用新密钥):
shm_id = shmget(key, 10*sizeof(char), IPC_CREAT | 0777);
标志0777是该段的权限,类似于文件的权限。
答案 1 :(得分:0)
By tracking the error using printf statement ,
main() {
key_t key=1235;
int shm_id;
void *shm;
char *message = "hello";
shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
printf("hello 1\n");
shm = shmat(shm_id,NULL,NULL);
printf("hello 2\n");
sprintf(shm,"%s",message);
printf("hello 3\n");
}
I explored that it is giving segmentation fault after executing sprint, so look for the arguments that you passed to function .
Similar is the case for sscanf in read.c