参考资料
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) 比较上述两种消息通信机制中数据传输的时间。
#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; }
#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; }
暂未实现,有会的小伙伴可以在评论区留言。大家一起交流进步。