書上關於進程間經過共享內存實現通訊的例子。ide
操做過程當中,一直提示 shmat error, 很納悶。spa
調試了很長時間,忽然想起shmat會將錯誤緣由存於error中,因此在源代碼中加了一句
printf("%s\n", sys_errlist[errno]);
運行結果顯示
Permission denied.
原來是沒有權限,運行時 加上 sudo , OK。解決.調試
m1.ccode
#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #define BUF_SIZE 1024 #define MYKEY 24 int main(int argc, char *argv[]) { int shmid; char *shmptr; if((shmid=shmget(MYKEY, BUF_SIZE, IPC_CREAT)) == -1) { fprintf(stderr, "shmget error!\n"); exit(1); } printf("%d\n", shmid); if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) { printf("%s\n", sys_errlist[errno]); exit(1); } while(1) { printf("string:%s\n", shmptr); putchar('\n'); sleep(2); } exit(0); }
m2.cxml
#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #define BUF_SIZE 1024 #define MYKEY 24 int main(int argc, char *argv[]) { int shmid; char *shmptr; if((shmid=shmget(MYKEY, BUF_SIZE, IPC_CREAT)) == -1) { fprintf(stderr, "shmget ERROR!\n"); exit(1); } if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) { fprintf(stderr, "shmat error!\n"); printf("%s\n", sys_errlist[errno]); exit(1); } while(1) { printf("input string:\n"); scanf("%s", shmptr); } exit(0); }