源码
书上关于进程间通过共享内存实现通信的例子。
遇到了问题
操作过程中,一直提示 shmat error, 很纳闷。
解决
调试了很长时间,突然想起shmat会将错误原因存于error中,所以在源代码中加了一句
printf("%s
", sys_errlist[errno]);
运行结果显示
Permission denied.
原来是没有权限,运行时 加上 sudo , OK。解决.
代码如下
m1.c
#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! "); exit(1); } printf("%d ", shmid); if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) { printf("%s ", sys_errlist[errno]); exit(1); } while(1) { printf("string:%s ", shmptr); putchar(' '); sleep(2); } exit(0); }
m2.c
#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! "); exit(1); } if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) { fprintf(stderr, "shmat error! "); printf("%s ", sys_errlist[errno]); exit(1); } while(1) { printf("input string: "); scanf("%s", shmptr); } exit(0); }