非亲缘进程间的共享内存与信号通信
2011-09-02 19:47
375 查看
/***************************** 写入数据到共享内存,后再得到另一个进程pid 向其发送SIGUSR1信号,另一个进程 收到后退出 ***************************/ #include<sys/shm.h> #include<sys/ipc.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<errno.h> #define SIZE 1024 int main(void) { sleep(2); char *addr; char buf[50]; int shmid; printf("please input string to share memory\n"); fgets(buf,100,stdin); key_t key; key = ftok(".",'a'); printf("key = %d\n",(int)key); if((shmid = shmget(key,SIZE,0666|IPC_CREAT)) < 0) perror("shmget"); else{ printf("get share memory success\n"); printf("shmid = %d\n",shmid); } addr = shmat(shmid,NULL,0); if( addr == (void *)(-1)) perror("shmat"); else{ printf("get addr success\n"); printf("addr = %p\n",addr); } strcpy(addr+4,buf); pid_t pid; strncpy(&pid,addr,4); kill(pid,SIGUSR1); if(shmdt(addr) < 0) perror("shmdt"); else printf("detached share memory\n"); return 0; }
/************************ 先写入自己的pid 对方写完数据后 向 自己 发送一SIGUSR1信号,收到 信号后,读数据后退出. **********************/ #include<sys/shm.h> #include<sys/ipc.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<errno.h> #define SIZE 1024 void get(int sig); int main(void) { char *addr; char buf[50]; int shmid; signal(SIGUSR1,get); key_t key; key = ftok(".",'a'); printf("key = %d\n",key); shmid = shmget(key,SIZE,0666|IPC_CREAT); if(shmid < 0) perror("shmget"); else{ printf("get share memory success\n"); printf("shmid = %d\n",shmid); } addr = shmat(shmid,NULL,0); if(addr == (void *)(-1)) perror("shmat"); else{ printf("get addr success\n"); printf("addr = %p\n",addr); } pid_t pid = getpid(); strncpy(addr,&pid,4); pause(); strcpy(buf,addr+4); fprintf(stdout,"get message from shm:\n%s\n",buf); if(shmdt(addr)<0) perror("shmdt"); else printf("detached share memory success\n"); if (shmctl(shmid, IPC_RMID, NULL) == -1) perror("Child: shmctl(IPC_RMID)\n"); else printf("Delete shared-memory\n"); return 0; } void get(int sig) { }
相关文章推荐
- 非亲缘进程间的共享内存与信号通信
- 操作系统 进程间的通信 之 信号 消息队列 共享内存 浅析
- 进程间的通信方式--信号、管道、消息队列、共享内存
- Linux----进程通信—共享内存
- 进程间的八种通信方式----共享内存是最快的 IPC 方式
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- 应用程序开发-进程通信-共享内存
- 进程间的通信(管道,共享内存)
- C# 进程间共享内存通信方式
- 进程通信-共享内存-mmap()-code2
- linux进程通信之信号量、共享内存
- 父子进程共享内存通信的三种方法
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转
- UNIX系统中的进程通信之共享内存
- nginx进程间的通信机制源码分析(一)----共享内存
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- 共享内存多进程间通信,进程间同步使用信号量来实现
- linux 进程间的通信(五) 共享内存-1
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- linux下通过共享内存在进程之间实现通信(system V)