C SystemV共享内存的分段故障

C SystemV共享内存的分段故障,c,shared-memory,strcpy,C,Shared Memory,Strcpy,当我试图使用strcpy将一些字符复制到共享内存中时,我试图理解为什么这个简单的代码会导致分段错误: #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <string.h> int main() { key_t key; int flag,id; char *buf;

当我试图使用
strcpy
将一些字符复制到共享内存中时,我试图理解为什么这个简单的代码会导致分段错误:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

int main()
{
    key_t key;
    int flag,id;
    char *buf;

    flag=IPC_CREAT|0600;
    if((key=ftok("myfile",12)) == -1 ) {
        perror("key");
        exit(2);
    }   
    printf("%X\n",key);

    if( (id=shmget(key,512,flag)) < 0) exit(1); 

    if( (buf=shmat(id,0,0)) < 0) exit(2);

    printf("PID %d, buf=%p\n",getpid(),buf);
    system("ipcs -m | grep 512");
    sleep(20);

    strcpy(buf,"Hello");
    sleep(100); 
    shmdt(buf);
    exit(0);
}
此外,该过程的pmap表明:

00007f778bc78000      4K rw-s-    [ shmid=0x10358072 ]
我猜指针
buf
有问题,但到目前为止我不知道如何纠正


有什么想法吗?

请在编译时启用所有警告(例如,对于gcc和clang,至少要启用
-Wall

您缺少
#include
,因此编译器假定
smhat
返回一个int,而实际上它返回一个
void*
。如果int和
void*
的大小不匹配,则说明存在问题


添加包含的内容,添加您在使用时丢失的其他内容,应该可以使用。

请在编译时启用所有警告(例如,对于gcc和clang,至少
-Wall

您缺少
#include
,因此编译器假定
smhat
返回一个int,而实际上它返回一个
void*
。如果int和
void*
的大小不匹配,则说明存在问题


添加包含的内容,添加您在使用时丢失的其他内容,应该可以使用。

请在编译时启用所有警告(例如,对于gcc和clang,至少
-Wall

您缺少
#include
,因此编译器假定
smhat
返回一个int,而实际上它返回一个
void*
。如果int和
void*
的大小不匹配,则说明存在问题


添加包含的内容,添加您在使用时丢失的其他内容,应该可以使用。

请在编译时启用所有警告(例如,对于gcc和clang,至少
-Wall

您缺少
#include
,因此编译器假定
smhat
返回一个int,而实际上它返回一个
void*
。如果int和
void*
的大小不匹配,则说明存在问题


添加那些包含,添加其他您在使用时丢失的,它应该会工作。

注意编译器发出的警告。特别是,您可以得到:

file.c:22:5: warning: implicit declaration of function ‘shmat’ [-Wimplicit-function-declaration]
file.c:22:13: warning: assignment makes pointer from integer without a cast

这说明了问题所在——编译器假设
shmat
返回一个(32位)整数,而实际上它返回一个(64位)指针。因此,指针的前32位丢失了…

请注意编译器发出的警告。特别是,您可以得到:

file.c:22:5: warning: implicit declaration of function ‘shmat’ [-Wimplicit-function-declaration]
file.c:22:13: warning: assignment makes pointer from integer without a cast

这说明了问题所在——编译器假设
shmat
返回一个(32位)整数,而实际上它返回一个(64位)指针。因此,指针的前32位丢失了…

请注意编译器发出的警告。特别是,您可以得到:

file.c:22:5: warning: implicit declaration of function ‘shmat’ [-Wimplicit-function-declaration]
file.c:22:13: warning: assignment makes pointer from integer without a cast

这说明了问题所在——编译器假设
shmat
返回一个(32位)整数,而实际上它返回一个(64位)指针。因此,指针的前32位丢失了…

请注意编译器发出的警告。特别是,您可以得到:

file.c:22:5: warning: implicit declaration of function ‘shmat’ [-Wimplicit-function-declaration]
file.c:22:13: warning: assignment makes pointer from integer without a cast
这说明了问题所在——编译器假设
shmat
返回一个(32位)整数,而实际上它返回一个(64位)指针。因此,指针的前32位丢失了…

此信息来自 需要考虑到:

重要: 未明确删除的信号量和共享内存保留在系统中 创建它们的进程终止后 甚至当用户注销时

自UNIX以来 支持有限数量的这些资源,它是 重要的是要确保所有 信号量和共享内存是远程的 在注销前请先确认

目录 /usr/class/cis660包括 这是脚本文件 rsm .dat,它提供了移除所有 信号量和所有共享内存同时出现

单独的信号灯或共享的备忘录 可以使用UNIX命令删除ry ipcrm–s sem# 或 ipcrm–m mem# ,其中sem#和mem#分别从UNIX命令获得 ipcs ,其中列出了所有信号量和共享内存 需要考虑到:

重要: 未明确删除的信号量和共享内存保留在系统中 创建它们的进程终止后 甚至当用户注销时

自UNIX以来 支持有限数量的这些资源,它是 重要的是要确保所有 信号量和共享内存是远程的 在注销前请先确认

目录 /usr/class/cis660包括 这是脚本文件 rsm .dat,它提供了移除所有 信号量和所有共享内存同时出现

单独的信号灯或共享的备忘录 可以使用UNIX命令删除ry ipcrm–s sem# 或 ipcrm–m mem# ,其中sem#和mem#分别从UNIX命令获得 ipcs ,其中列出了所有信号量和共享内存 需要考虑到:

重要: 未明确删除的信号量和共享内存保留在系统中 创建它们的进程终止后 甚至当用户注销时

自UNIX以来 支持有限数量的这些资源,它是 重要的是要确保所有 信号量和共享内存是远程的 在注销前请先确认

目录 /usr/class/cis660包括 这是脚本文件 rsm .dat,它提供了移除所有 信号量和所有共享内存同时出现

单独的信号灯或共享的备忘录 可以使用UNIX命令删除ry ipcrm–s sem# 或 ipcrm–m mem# ,其中sem#和mem#分别从UNIX命令获得 ipcs ,其中列出了所有信号量和共享内存 需要考虑到:

重要: 未明确删除的信号量和共享内存保留在系统中 创建它们的进程终止后 甚至当用户注销时