8.23进程线程作业

使用消息队列完成两个进程间相互通信

1.

#include<myhead.h>

//消息结构体
typedef struct
{
    long msgtype;         //消息类型
	char data[1024];      //消息正文
}Msg_ds;

#define SIZE sizeof(Msg_ds)-sizeof(long)        //正文大小

int main(int argc, const char *argv[])
{
	key_t key;    //1,创建key值
	pid_t pid;    //创建进程

	if((key = ftok("/",'k')) == -1)
	{
	     perror("ftok error");
		 return -1;
	}


	//2,创建消息队列
	int msgid;
	Msg_ds msg;
	if((msgid = msgget(key,IPC_CREAT|0664)) == -1)
	{
	    perror("msgget error");
		return -1;
	}

	//定义进程
    pid = fork();
	if(pid < 0)
	{
	    perror("fork error");
		return -1;
	}else if(pid == 0)
	{
	    //子进程写入数据
     while(1)
	 {
	    printf("请输入消息内容:\n");
		fgets(msg.data,sizeof(msg.data),stdin);     //从终端输入字符串
        
		//将字符串的'\n'换成'\0'
		msg.data[strlen(msg.data)-1] = '\0';

		//将消息发送到消息队列中
		if(msgsnd(msgid,&msg,SIZE,0) == -1)
		{
		    perror("msgsnd error");
			return -1;
		}

		if(strcmp(msg.data,"quit") == 0)
		{
		    break;
		}
	  }

	}else
	{
	    //父进程读取数据
		while(1)
		{
		    //从消息队列中取数据
			if(msgrcv(msgid,&msg,SIZE,0,0) == -1)
			{
			    perror("msgsnd error");
				return -1;
			}

			if(strcmp(msg.data,"quit") == 0)
			{
			    break;
			}

			printf("接受信息:%s\n",msg.data);
		}

	}

	msgctl(msgid,IPC_RMID,NULL);
	return 0;
}

2.

#include<myhead.h>


//消息结构体
typedef struct
{
    long msgtype;
	char data[1024];
}Msg_ds;

#define SIZE sizeof(Msg_ds)-sizeof(long)


int main(int argc, const char *argv[])
{

	key_t key;   //创建k值
	pid_t pid;   //创建进程

	if((key = ftok("/",'k')) == -1)
	{
	    perror("ftok error");
		return -1;
	}

	//创建消息队列
	int msgid;
	Msg_ds msg;

	if((msgid = msgget(key,IPC_CREAT|0664)) == -1)
	{
	    perror("msgget error");
		return -1;
	}

	//定义进程
	pid = fork();
	if(pid < 0)
	{
	    perror("fork error");
		return -1;
	}else if(pid == 0)
	{
	    //子进程读入数据
		while(1)
		{
		   if(msgrcv(msgid,&msg,SIZE,0,0) == -1)
		   {
		       perror("msgsnd errro");
			   return -1;
		   }

		   if(strcmp(msg.data,"quit") == 0)
		   {
		       break;
		   }

		   printf("接收信息:%s\n",msg.data);
		}

		exit(EXIT_SUCCESS);
     }else
	 {
	     //父进程写入数据
		 while(1)
		 {
		     printf("请输入消息内容为:\n");
			 fgets(msg.data,sizeof(msg.data),stdin);

			 //将字符串的'\n'换成'\0'
			 msg.data[strlen(msg.data)-1] = '\0';

			 //将消息发送到消息队列中
			 if(msgsnd(msgid,&msg,SIZE,0) == -1)
			 {
			     perror("msgsnd error");
				 return -1;
			 }

			 if(strcmp(msg.data,"quit") == 0)
			 {
			     break;
			 }
		 }

		 exit(EXIT_SUCCESS);
	 }
	
	msgctl(msgid,IPC_RMID,NULL);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/JunCool02/article/details/132460972