书上关于进程间经过共享内存实现通讯的例子。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); }