Linux ipc------ 信号量+共享内存编程
来源:互联网 发布:龙岩 淘宝 诈骗 编辑:程序博客网 时间:2024/05/21 09:47
此程序实现没有亲缘关系的两个进程间通过共享内存进行数据通信。
同时,使用信号量保证两个进程的读写同步:发送方在写共享内存时,接收方不能读数据;接收方在读数据时,发送方不能写数据。
1、fork创建子进程
2、使用二元信号量,同步读写端
fork_shm.c
#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include"send_recv.h"int main(void){printf("fork test!\n");pid_t pid;if((pid=fork())==-1)printf("fork error");else if(pid==0){printf("in the child process\n");printf("the father process's ppid is %d\n",getppid());fork_recv();}else{//sleep(1);printf("in the parent process\n");printf("the son process's pid is %d\n",getpid());fork_send();}return 0;}
send_recv.c
#include"fork_recv.c"#include"fork_send.c"int fork_recv();int fork_send();
fork_send.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/shm.h>#include <sys/ipc.h>#include <sys/sem.h>#include <string.h>int fork_send(){int running=1;int shid;int semid;int value;void *sharem=NULL;struct sembuf sem_b;sem_b.sem_num = 0;sem_b.sem_flg = SEM_UNDO;if((semid=semget((key_t)123456,1,0666|IPC_CREAT))==-1){perror("semget");exit(EXIT_FAILURE);}if (semctl(semid, 0, SETVAL, 0) == -1){printf("sem init error"); if(semctl(semid,0,IPC_RMID,0)!=0){perror("semctl");exit(EXIT_FAILURE);}exit(EXIT_FAILURE);}shid=shmget((key_t)654321,(size_t)2048,0600|IPC_CREAT);if(shid==-1){perror("shmget");exit(EXIT_FAILURE);}sharem=shmat(shid,NULL,0);if(sharem==NULL){perror("shmat");exit(EXIT_FAILURE);}while(running){if((value=semctl( semid, 0, GETVAL ))==0){printf("write data operate\n");printf("please input something:\n");scanf("%s",sharem);sem_b.sem_op = 1;if (semop(semid, &sem_b, 1) == -1) {fprintf(stderr, "semaphore_p failed\n");exit(EXIT_FAILURE);}}if(strcmp(sharem,"end")==0)running--;}shmdt(sharem);return 0;}
fork_recv.c
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>int fork_recv(){int running=1;char *shm_p=NULL;int shmid;int semid;int value;struct sembuf sem_b;sem_b.sem_num = 0;sem_b.sem_flg = SEM_UNDO;if((semid=semget((key_t)123456,1,0666|IPC_CREAT))==-1){perror("semget");exit(EXIT_FAILURE);}shmid=shmget((key_t)654321,(size_t)2048,0600|IPC_CREAT);if(shmid==-1){perror("shmget");exit(EXIT_FAILURE);}shm_p=shmat(shmid,NULL,0);if(shm_p==NULL){perror("shmat");exit(EXIT_FAILURE);}while(running){if((value=semctl( semid, 0, GETVAL ))==1){printf("read data operate\n");sem_b.sem_op = -1;if (semop(semid, &sem_b, 1) == -1) {fprintf(stderr, "semaphore_p failed\n");exit(EXIT_FAILURE);}printf("%s\n",shm_p);}if(strcmp(shm_p,"end")==0)running--;}shmdt(shm_p);if(shmctl(shmid,IPC_RMID,0)!=0){perror("shmctl");exit(EXIT_FAILURE);}if(semctl(semid,0,IPC_RMID,0)!=0){perror("semctl");exit(EXIT_FAILURE);}return 0;}
0 0
- Linux ipc------ 信号量+共享内存编程
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- IPC参数(共享内存/信号量)
- Linux下IPC:信号量与共享内存详解
- linux基于信号量同步的共享内存IPC实现
- 【Linux/OS/Network】XSI IPC(消息队列,信号量,共享内存)
- linux共享内存+信号量编程示例
- linux+信号量+共享内存编程实例
- Linux C编程--进程间通信(IPC)6--综合应用实例--信号量和共享内存的使用
- Linux C编程--进程间通信(IPC)6--综合应用实例--信号量和共享内存的使用
- linux IPC---共享内存
- 封装ipc,共享内存,消息队列,信号量
- 共享内存+信号量+消息队列实现IPC
- XSI IPC(消息队列、信号量、共享内存)
- linux学习---基于内存的IPC(共享内存,信号量数组,消息队列)
- IPC机制---共享内存编程
- [linux系统编程]System V IPC 共享内存
- Optimizing Oracle RAC
- 自定义控件之绘图篇(二):路径及文字
- 用最简短的语言解释MapReduce
- 重置mysql主从同步:reset master和reset slave
- jsp中内置对象的四个作用域
- Linux ipc------ 信号量+共享内存编程
- 如何对double型变量进行memset获得极大值或极小值
- char*转CString 等一系列转换
- LeetCode之旅(22)
- 使用Dev Tools查看App的包名和所有Activity
- linux exec用法
- 【Android基础】页面跳转与传值(Activity跳转与传值)
- case when end用法
- 关于xp上安装VS2010后打开cpp 鼠标不停闪烁刷新的问题