IOday7作业

文章详细介绍了如何使用C语言中的信号和消息队列机制,展示了一个示例,演示了父进程向子进程发送消息以及子进程接收并处理消息的过程。
摘要由CSDN通过智能技术生成

1> 将信号和消息队列的课堂代码敲一遍

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

#include<myhead.h>
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
	long mtype;
	char mtext[1024];

};
int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
		key_t key = 0;

		if((key=ftok("/",'k'))==-1)
		{
			perror("ftok error");
			return -1;
		}
		printf("ftok success key = %#x\n",key);
		int msqid = -1;
		if((msqid = msgget(key,IPC_CREAT|0664))==-1)
		{
			perror("msgget error");
			return -1;
		}
		printf("msgget success msqid = %d\n",msqid);

		struct msgbuf sbuf;

		while(1)
		{
			bzero(sbuf.mtext, sizeof(sbuf.mtext));
			printf("消息类型:");
			scanf("%ld",&sbuf.mtype);
			getchar();
			printf("请输入正文:");
			fgets(sbuf.mtext,sizeof(sbuf.mtext), stdin);
			sbuf.mtext[strlen(sbuf.mtext)-1]=0;
			msgsnd(msqid,&sbuf, MSGSIZE, 0);
			printf("发送成功\n");
			if(strcmp(sbuf.mtext, "quit")==0)
			{
				break;
			}
		}
	}else if(pid==0)
	{
		key_t key1 = 0;
		if((key1=ftok("/",'k'))==-1)
		{
			perror("ftok error");
			return -1;
		}
		printf("ftok success key1 = %#x\n",key1);
		int msqid1 = -1;
		if((msqid1 = msgget(key1,IPC_CREAT|0664))==-1)
		{
			perror("msgget error");
			return -1;
		}
		printf("msgget success msqid1 = %d\n",msqid1);

		struct msgbuf rbuf;

		while(1)
		{
			bzero(rbuf.mtext, sizeof(rbuf.mtext));
			msgrcv(msqid1,&rbuf,MSGSIZE,2,0);
			printf("收到消息为:%s\n",rbuf.mtext);
			if(strcmp(rbuf.mtext, "quit")==0)
			{
				break;
			}
		}
		if(msgctl(msqid1,IPC_RMID,NULL)!=0)
		{
			perror("msgctl error");
			return -1;
		}


	}
	else
	{
		perror("fork error");
		return -1;
	}

	return 0;
}





#include<myhead.h>
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
	long mtype;
	char mtext[1024];

};
int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
		key_t key = 0;

		if((key=ftok("/",'k'))==-1)
		{
			perror("ftok error");
			return -1;
		}
		printf("ftok success key = %#x\n",key);
		int msqid = -1;
		if((msqid = msgget(key,IPC_CREAT|0664))==-1)
		{
			perror("msgget error");
			return -1;
		}
		printf("msgget success msqid = %d\n",msqid);

		struct msgbuf sbuf;

		while(1)
		{
			bzero(sbuf.mtext, sizeof(sbuf.mtext));
			printf("消息类型:");
			scanf("%ld",&sbuf.mtype);
			getchar();
			printf("请输入正文:");
			fgets(sbuf.mtext,sizeof(sbuf.mtext), stdin);
			sbuf.mtext[strlen(sbuf.mtext)-1]=0;
			msgsnd(msqid,&sbuf, MSGSIZE, 0);
			printf("发送成功\n");
			if(strcmp(sbuf.mtext, "quit")==0)
			{
				break;
			}
		}
	}else if(pid==0)
	{
		key_t key1 = 0;
		if((key1=ftok("/",'k'))==-1)
		{
			perror("ftok error");
			return -1;
		}
		printf("ftok success key1 = %#x\n",key1);
		int msqid1 = -1;
		if((msqid1 = msgget(key1,IPC_CREAT|0664))==-1)
		{
			perror("msgget error");
			return -1;
		}
		printf("msgget success msqid = %d\n",msqid1);

		struct msgbuf rbuf;

		while(1)
		{
			bzero(rbuf.mtext, sizeof(rbuf.mtext));
			msgrcv(msqid1,&rbuf,MSGSIZE,1,0);
			printf("收到消息为:%s\n",rbuf.mtext);
			if(strcmp(rbuf.mtext, "quit")==0)
			{
				break;
			}
		}
		if(msgctl(msqid1,IPC_RMID,NULL)!=0)
		{
			perror("msgctl error");
			return -1;
		}


	}
	else
	{
		perror("fork error");
		return -1;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值