进程通信----共享内存
父子进程之间为例:
流程:
1. 创建共享内存
2. 创建子进程
3. 父进程中 映射内存 向内存写数据strncpy wait同步子进程
4. 子进程中 映射内存 等待父进程写入sleep 操作内存(可读)
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h>
#define PERM S_IRUSR|S_IWUSR
int main(int argc, char **argv) { int shmid; char *f_addr, *c_addr;
if(argc != 2) { printf("Usage: ./shm ni hao \n"); exit(1); } if((shmid = shmget(IPC_PRIVATE, 1024, PERM)) < 0) // (()())()
{ printf("shmget error:%s\n", strerror(errno)); exit(1); } printf("shmget ok!\n"); /* if( fork() < 0) { printf("fork error:%s\n", strerror(errno)); exit(1); }*/ if(fork()) { printf("father process...\n"); f_addr = shmat(shmid, 0, 0); memset(f_addr, '\0', 1024); strncpy(f_addr, argv[1],1024); printf("father exit!\n"); wait(NULL); // sleep(3);
} else { sleep(1); printf("child process...\n"); c_addr = shmat(shmid, 0, 0); printf("client get:%s\n", c_addr); } }
|
易错点:
1.int main(int argc, char **argv)
主函数**argv
2.if((shmid = shmget(IPC_PRIVATE, 1024, PERM)) < 0) // (()())()
先将赋值括起来,然后与0比较, 注意内存属性的描述
3. memset(f_addr, '\0', 1024);
映射之后,写之前要初始化内存。
4.wait(NULL);
先执行的进程要等待后执行的进程! (PS:字体颜色较乱,没法改,我不会操作)
阅读(1468) | 评论(1) | 转发(0) |