内核作业补充

编写两个程序,一个是服务者程序,一个是客户程序,执行两个进程之间通过消息机制进行通信,消息表示msgkey可以使用常量定义,以便双方都可以利用。客户端将自己的进程号和父进程发送给服务器端,服务器端进程收到消息后,将自己的进程号和父进程号发给客户,然后返回。客户端收到后回显服务器端的pid和ppid,结束

客户进程

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<stdio.h>
#define MSGKEY 75

struct msgform{//发送的内容
	long mtype;
	char mtext[256];
};

int main(){
	struct msgform msg;
	
/*
行为:
发送自己的pid
接受信息并显示
*/
	//装填自己的信息包,准备发送
	msg.mtype=1;
	//制作mtext
	int *p;
	p=(int *)msg.mtext;
	int pid=getpid();
	*p=pid;//往载荷中放上自己的ProcessId
	
	int msgpid=msgget(MSGKEY,0777);
	msgsnd(msgpid,&msg,sizeof(int),0);//发送

	msgrcv(msgpid,&msg,256,pid,0);//接受信息
	printf("客户机: 从%d服务器收到了应答\n",* p);//取出载荷的内容并显示	
	
	return 0;
}

服务器进程

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<stdio.h>
#define MSGKEY 75

struct msgform{//发送的内容
	long mtype;
	char mtext[256]; 
};

int msgpid;
int main(){
	extern cleanup();
	for(int i=0;i<20;i++)
		signal(i,cleanup);	//设置软中断信号处理程序
	
/*
行为:
接受信息并显示,然后向对方发送自己的pid
*/
	//====================== 监听==========================
	msgpid=msgget(MSGKEY,0777|IPC_CREAT); //初始化消息队列
	for(;;){				//一直接收消息
		struct msgform msg;
		msgrcv(msgpid,&msg,256,1,0);//接受信息
		int *p=(int*)msg.mtext;//载荷指针
		
		int pid=*p;//取出载荷的内容并显示
		printf("服务器: 从%d收到了它自己发送的pid\n",pid);

		//装填自己的信息包,准备发送
		msg.mtype=pid;
		*p=getpid();//往载荷中放上自己的ProcessId
		msgsnd(msgpid,&msg,sizeof(int),0);//发送信息
	}


	return 0;
}

cleanup(){
	msgctl(msgpid,IPC_RMID,0);
	exit(1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值