首页 > 代码库 > 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下多进程+信号量+共享内存编程