[英]Putting a Struct into Shared Memory
我創建了兩個程序server.c和client.c。 我有一個年齡的結構。 我已經讓程序一起工作以讀取共享內存並更改共享內存,但是,這僅在結構中使用一個變量時有效。 一旦我在結構中有多個變量,我就會遇到分段錯誤。
Server.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
typedef struct People
{
int age;
int isDone;
} Person;
int main()
{
Person aaron;
Person *p_aaron;
int id;
int key = 5432;
p_aaron = &aaron;
(*p_aaron).age = 19;
(*p_aaron).isDone = 0;
if ((id = shmget(key,sizeof(aaron), IPC_CREAT | 0666)) < 0)
{
perror("SHMGET");
exit(1);
}
if((p_aaron = shmat(id, NULL, 0)) == (Person *) -1)
{
perror("SHMAT");
exit(1);
}
(*p_aaron).age = 19;
printf("Shared Memory Age: %d\n", (*p_aaron).age);
*p_aaron = aaron;
while ((*p_aaron).age == 19)
{
sleep(1);
}
printf("Shared Memory Age Turned To: %d", (*p_aaron).age);
return 0;
}
Client.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
typedef struct People
{
int age;
} Person;
int main()
{
Person aaron;
Person *p_aaron;
int id;
int key = 5432;
p_aaron = &aaron;
id = shmget(key,sizeof(aaron), IPC_CREAT | 0644);
p_aaron = shmat(id, NULL, 0);
printf("%d", (*p_aaron).age);
(*p_aaron).age = 21;
return 0;
}
來自Server.c的錯誤消息
SHMGET: Invalid argument
RUN FINISHED; exit value 1; real time: 0ms; user: 0ms; system: 0ms
您沒有顯示任何刪除共享內存段的代碼。
如果查看shmget()
的POSIX規范,則會看到在以下情況下可以給出正在報告的EINVAL
錯誤:
[EINVAL]
將創建一個共享內存段,並且size的值小於系統施加的最小值或大於系統施加的最大值。
[EINVAL]
沒有要創建的共享內存段,並且存在用於密鑰的共享內存段,但是與其關聯的段的大小小於大小。
我認為您可能會遇到第二種情況; 您正在嘗試創建一個比現有內存段更大的共享內存段。
另外,正如我在評論中指出的那樣,您應該確保客戶端程序和服務器程序在共享內存中的結構大小上達成一致。 其他任何事情都是災難的根源。 您應該將結構定義放入標頭中,並且兩個程序都應使用該標頭,並且在更改標頭的定義時都應重新編譯兩者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.