【发布时间】:2014-05-26 18:30:44
【问题描述】:
我想创建一个服务器-客户端程序,其中两个进程使用共享内存在彼此之间传递信息
要传递的信息:
typedef struct shared_mem{
int board[BOARD_SIZE * BOARD_SIZE];
int goal;
}shared_mem;
shared_mem *msg;
服务器:
int main(int argc, char **argv) {
int shmid;
key_t key=ftok("2048_client", 42);
if(key == -1) {
printf("ftok failed");
return -1;
}
shared_mem *shm;
msg=(shared_mem *)malloc(sizeof(shared_mem));
/*
* Create the segment
*/
if ((shmid = shmget(key, sizeof(msg), IPC_CREAT)) < 0) {
perror("shmget");
exit(1);
}
/*
* Now we attach the segment to our data space.
*/
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
msg=shm;
(*msg).goal=64;
}
客户:
int main(int argc, char **argv) {
int shmid;
key_t key=ftok("2048_client", 42);
if(key == -1) {
printf("ftok failed");
return -1;
}
shared_mem *shm;
msg=(shared_mem *)malloc(sizeof(shared_mem));
/*
* Create the segment.
*/
if ((shmid = shmget(key, sizeof(msg), 0)) < 0) {
perror("shmget");
exit(1);
}
/*
* Now we attach the segment to our data space.
*/
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
msg=shm;
printf("dscsadc: %d",msg->goal);
}
我是共享内存的新手,我想了解它为什么不工作以及它应该如何工作。我收到“shmat:权限被拒绝”
【问题讨论】:
-
怎么不工作?你得到什么错误?
-
这里唯一看起来明显错误的事情是您必须为
key提供一个值(ftok可能对此有所帮助),并且您可能也是需要将sizeof(msg)舍入为sysconf(_SC_PAGESIZE)的倍数。除此之外:这是什么你没想到的? -
@Zack 我尝试使用 ftok 但我收到错误:shmat: Permission denied
-
在服务器中,
msg=shm;行泄漏了精心分配的内存;删除malloc()行。同样在客户端。(*msg).goal=64;行通常会写成msg->goal = 64;—->运算符的发明是有原因的。 -
@JonathanLeffler 我试过这样做,但我得到一个错误,说每个函数都定义了不止一次:2048.c:120:40:警告:不同指针类型的比较缺少强制转换[默认启用] /tmp/ccNMeNPm.o: 在函数
main': 2048.c:(.text+0x45): multiple definition ofmain' /tmp/ccLsff3I.o:2048_client.c:(.text+0x0): 首先定义在这里 2048: 在函数move_board': (.text+0xaff): multiple definition ofmove_board' /tmp/ccNMeNPm。 o:2048.c:(.text+0xa1b): 首先定义在这里等等所有其他函数。
标签: c client-server shared-memory