首页 > 代码库 > linux下多进程+信号量+共享内存编程
linux下多进程+信号量+共享内存编程
此程序实现没有亲缘关系的两个进程间通过共享内存进行数据通信。
同时,使用信号量保证两个进程的读写同步:发送方在写共享内存时,接收方不能读数据;接收方在读数据时,发送方不能写数据。
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=http://www.mamicode.com/semctl( semid, 0, GETVAL ))==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=http://www.mamicode.com/semctl( semid, 0, GETVAL ))==1)>linux下多进程+信号量+共享内存编程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。