操作系统实验——进程通信
参考资料
1.实验要求
1、进程通信
编写一段程序,实现进程的管道通信。
使用系统调用 pipe()建立一条管道线:两个子进程 P1 和 P2 分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程则从管道中读出 来自两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程 P1 发来的消息,然后再接收子进程 P2 发来的消息。(可以通过 sleep()将自身进入睡眠)
2、 消息的创建,发送和接收.
(1) 使用系统调用 msgget(), msgsnd(), msgsrv()及 msgctl()编制一长度为 1K 的消息(如个人通信录信息)的发送和接收程序.
① 观察上面程序,说明控制消息队列系统调用 msgctl()
② 共享存储区的发送和接收。
(2) 使用共享存储区相关的系统调用 shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序.
(3) 比较上述两种消息通信机制中数据传输的时间。
2.管道通信
- 代码实现
#include<stdio.h>
#include <stdlib.h>
int main()
{
int id,fd[2],pid;
char buf[50],s[50];
//创建一个管道 fd[0]:读管道,fd[1]:写管道。
pipe(fd);
while ((id=fork())==-1);
if (id==0)
{ //将后边的字符串写到buf中
sprintf(buf,"Child1 is sending message!");
write(fd[1],buf,50);
//立即终止调用进程
exit(0);
}
else
{
//在获得通知前该线程将一直等待
wait(0);
read(fd[0],s,50);
printf("%s\n",s);
while ((pid=fork())==-1);
if (pid==0){
sprintf(buf,"Child2 is sending message!");
write(fd[1],buf,50);
exit(0);
}
else{
wait(0);
read(fd[0],s,50);
printf("%s\n",s);
}
}
return 0;
}
- 运行结果
3.消息队列通信
- 代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSG_KEY 24
//消息队列标识符
int msqid;
struct msgbuf{
// 消息类型
long mtype;
// 缓冲区大小
char mtext[1024];
}msgbuf;
void client(){
msqid=msgget(MSG_KEY,0666|IPC_CREAT);
printf("Input a line:");
scanf("%s",msgbuf.mtext);
msgbuf.mtype=1;
//将消息输入到缓冲区中
msgsnd(msqid,&msgbuf,1024,0);
}
void server(){
msqid=msgget(MSG_KEY,IPC_CREAT|0666);
//从缓冲区中取出消息
msgrcv(msqid,&msgbuf,1024,2L,0);
printf("The reversed line is:%s\n",msgbuf.mtext);
//删除消息队列
msgctl(msqid,IPC_RMID,0);
}
int main()
{
int p1;
while((p1=fork())==-1);
if (p1==0){
server();
wait(0);
}
else{
client();
}
return 0;
}
- 运行结果
4.共享区通信
暂未实现,有会的小伙伴可以在评论区留言。大家一起交流进步。