這是我等待兩個文件共享內存,一個是寫入數據共享內存,另一個是從共享內存和printf數據讀取數據;但有一些錯誤。共享內存錯誤:在CentOS6.8中,shmat返回NULL,errno(22:無效參數)
shm_w.c
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,IPC_CREAT | 0666);
printf("shmid is = %d,pid=%d\n",shmid,getpid());
mem=shmat(shmid,(const void*)0,0);
if((int)mem==-1)
{
printf("attach faile.\n");
}
strcpy((char*)mem,"Hello,this is test memory.\n");
ret=shmdt(mem);
return 0;
}
shm_r.c
#include <errno.h>
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,0);
mem=shmat(shmid,(const void*)0,0);
//printf("%s\n",(char*)mem);
if(mem==(void*)-1)
{
fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",errno,strerror(errno));
return 2;
}
printf("%s\n",(char*)mem);
shmdt(mem);
return 0;
}
當我在CentOS6.8編譯會把兩個.c文件,在第一時間就可以了。
不幸的是,從現在開始,我符文she_w.c是正確太:
的shmid是= 65537,PID = 7116。
但是當我運行shm_r.c,它的出現錯誤:
shmat return NULL ,errno(22:Invalid argument)
,所以我不知道發生什麼事了嗎?我試圖解決它,例如使用ipcs -m,但不出現shmid。 而我cat/proc/7116/maps: 「沒有這樣的文件或目錄」
誰能告訴我發生了什麼?我怎樣才能在CentOS6.6上找到shmid
uname -r:
2.6.32-504.12.2.el6.x86_64
我也用cat/proc/sysvipc/shm | grep 65537,但不出現shmid。 不幸運!
請告訴我如何解決問題,如果您知道,謝謝!
'(常量無效*)0' - 使用'NULL'宏來得到一個_NULL指針constant_。 – Olaf
你是一個接一個地運行這兩個程序嗎?當第一個程序在另一個程序啓動之前分離內存段時,您會認爲會發生什麼?您需要等待另一個程序運行,然後才能分離該段。 –
「你是否一個接一個地運行這兩個程序?當第一個程序在另一個程序啓動之前分離內存段時,你會認爲會發生什麼?在分離該段之前,需要等待另一個程序運行。 「爲什麼在讀取程序後必須分離並且不能在寫入程序中分離?我的意思是寫程序寫數據結束,它可以分離,不知爲什麼當寫程序完成時可以使用分離。如果我在寫入程序中使用detach,共享內存將被釋放,所以讀取程序不能讀取數據? – Marcos