2024.02.04

写出三种进程间通信的代码示例

有名管道

创建两个有名管道文件

#include 
int main(int argc, const char *argv[])
{
	
	if(mkfifo("pipe1",0664)==-1)
	{
		perror("mkfifo pipe1 error");
		return -1;
	}
	if(mkfifo("pipe2",0664)==-1)
	{
		perror("mkfifo pipe2 error");
		return -1;
	}
	printf("关闭请按回车\n");
	getchar();
	system("rm pipe1");
	system("rm pipe2");
	return 0;
}

 发送


#include 
int main(int argc, const char *argv[])
{
	int wfd=-1;
	if((wfd=open("./mypipe",O_WRONLY))==-1)
	{
		perror("wfd open error");
		return -1;
	}
	char wbuf[128]="";
	while(1)
	{
		printf("请输入>>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		write(wfd,wbuf,sizeof(wbuf));
		if(strcmp(wbuf,"quit")==0)
		{
			break;
		}
	}
	close(wfd);
	return 0;
}

接收

#include 
int main(int argc, const char *argv[])
{
	int rfd=-1;
	if((rfd=open("./mypipe",O_RDONLY))==-1)
	{
		perror("rfd open error");
		return -1;
	}
	char rbuf[128]="";
	while(1)
	{
		read(rfd,rbuf,sizeof(rbuf));
		printf("收到一条消息:%s\n",rbuf);
		if(strcmp(rbuf,"quit")==0)
		{
			break;
		}
	}
	close(rfd);
	return 0;
}

消息队列

 发送

#include 
struct msgbuf
{
	long mtype;
	char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("key create error");
		return -1;
	}
	printf("key=%#x\n",key);
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return -1;
	}
	printf("msgid=%d\n",msgid);
	struct msgbuf buf;
	while(1)
	{
		printf("请输入您要发送的类型\n");
		scanf("%ld",&buf.mtype);
		printf("请输入消息内容\n");
		scanf("%s",buf.mtext);
		msgsnd(msgid,&buf,SIZE,0);
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
	}

	return 0;
}

 接收

#include 
struct msgbuf
{
	long mtype;
	char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("key create error");
		return -1;
	}
	printf("key=%#x\n",key);
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return -1;
	}
	printf("msgid=%d\n",msgid);
	struct msgbuf buf;
	while(1)
	{
		msgrcv(msgid,&buf,SIZE,10,0);
		printf("收到消息%s\n",buf.mtext);
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
	}

	return 0;
}

信号灯集

头文件

#ifndef __SEM_H__
#define __SEM_H__
#include 
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount);
//申请信号灯资源操作 p操作
int P(int semid,int semno);
//释放信号灯资源操作 v操作
int V(int semid,int semno);
//信号灯集的删除
int del_sem(int semid);

#endif
#include "sem.h"
 union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET
 */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
           };
int init_sem(int semid,int semno)
{
	int val=-1;
	printf("请输入标号为%d的灯的初始值:",semno);
	scanf("%d",&val);
	getchar();
	union semun us;
	us.val=val;
	if(semctl(semid,semno,SETVAL,us)==-1)
	{
		perror("set val error");
		return -1;
	}
	return 0;
}
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount)
{
	//1.创建key值
	key_t key=ftok("/",'y');
	if(key==-1)
	{
		perror("fork error");
		return -1;
	}
	//2.通过key值创建一个信号灯集
	int semid=semget(key,semcount,IPC_CREAT |IPC_EXCL|0664);
	if(semid==-1)
	{
		if(errno==EEXIST)
			{
				semid=semget(key,semcount,IPC_CREAT);
				return semid;
			}
		else
		{
			perror("semget error");
			return -1;
		}
	}
	//3.给信号灯集中的信号灯进行初始化操作
	for(int i=0;i

 发送

#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid=create_sem(2);
	if(semid==-1)
	{
		perror("creat_sem error");
		return -1;
	}
	//1.创建一个key值
	key_t key=ftok("/",'t');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	printf("key=%#x\n",key);
	//2.通过key值创建共享内存段
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid=%d",shmid);
	//3.将共享内存映射到用户空间
	char *addr=shmat(shmid,NULL,0);
	if(addr==(void *)-1)
	{
		printf("shmat error");
		return -1;
	}
	//4.使用共享内存段
	while(1)
	{
		P(semid,1);
		printf("please enter");
		fgets(addr,PAGE_SIZE,stdin);
		addr[strlen(addr)-1]=0;
		V(semid,0);
		if(strcmp(addr,"quit")==0)
		{
			break;
		}
	}
	//5.取消映射
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
		return -1;
	}
	//6.删除共享内存
	if(shmctl(shmid,IPC_RMID,0)==-1)
	{
		perror("shmctl error");
		return -1;
	}
	return 0;
}

 接收

#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid=create_sem(2);
	if(semid==-1)
	{
		perror("creat_sem error");
		return -1;
	}
	//1.创建一个key值
	key_t key=ftok("/",'t');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	printf("key=%#x\n",key);
	//2.通过key值创建共享内存段
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid=%d",shmid);
	//3.将共享内存映射到用户空间
	char *addr=shmat(shmid,NULL,0);
	if(addr==(void *)-1)
	{
		printf("shmat error");
		return -1;
	}
	//4.使用共享内存段
	while(1)
	{
		P(semid,0);
		printf("共享内存中的数据为:%s\n",addr);
		V(semid,1);
		if(strcmp(addr,"quit")==0)
		{
			break;
		}
	}
	//5.取消映射
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
		return -1;
	}
	//6.删除共享内存
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error");
		return -1;
	}
	del_sem(semid);
	return 0;
}

你可能感兴趣的:(算法)