实验三-进程通信_第1页
实验三-进程通信_第2页
实验三-进程通信_第3页
实验三-进程通信_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验三进程通信一 . 实验学时与类型学时: 2,课外学时:自定实验类型:设计性实验二 . 实验目的了解 Linux 的软中断、管道、消息队列、共享存储区等进程间通信方式。三 . 实验内容1. 软中断通信机制(1) 请编写一个程序:循环输出“ how are you? ”,在按下 Ctrl+C 后中断显示,输出 “Byebye! ”后退出程序。#include#includeint k=1;void int_func(int sig)/软中断处理函数 k=0; Int main() signal(SIGINT,int_func);/预置软中断信号处理函数 While(k=1)Printf( “

2、how are you?n ” );Printf(“ byebye! ” );(2)使用信号机制实现父子进程同步,父进程先输出#include#includeint k=1;void func(int sig) k=0; main()int pid;pid=fork();if(pid0)printf(“ An ” );kill(pid,12);A,然后子进程输出B。else if(pid=0) signal(12,func); while(k=1)sleep(1);printf(“ Bn ”);2. 管道机制(1) 父子进程通过管道传送一串字符。 要求:子进程随机从键盘输入一串字符, 通过管道

3、发给父进程,父进程从管道中将消息读出并显示出来。#include#includemain() int pid, fd2 ;char outpipe50, inpipe50;pipe(fd);pid=fork();if (pid=0)Printf(“ please input some message:n” );Fgets(inpipe,sizeof(inpipe),stdin);write(fd1,inpipe,50);else if (pid0);wait(0);Printf(“ father get this message:nread(fd0,outpipe,50);” );printf

4、(“ %sn” ,outpipe);( 2 )父子进程通过管道互相发送字符串。要求:子进程向父进程通过管道发送”child.”,父进程回送”I am father.”,父子进程将各自收到的字符串显示在屏幕上。I am#inlcude#include#includemain()int pid, fd2 ;char str150, str250;pipe(fd);pid=fork();if (pid=0)strcpy(str1,”I m child” );write(fd1,str1,strlen(str1);Sleep(1);read(fd0,str2,50);printf(“ Child re

5、ceived: %sn” ,str2);else if (pid0) read(fd0,str1,50);printf(“ Parent received:%sn”,str1);strcpy(str2,” I m father.” );write(fd1,str2,strlen(str2);3. 消息队列机制(1) 父进程及其子进程通过一条消息队列互相传送数据。#include#include#include#includeint msgqid,qid;struct msg long mtype; char mtext256;pmsg;cancelqueue() msgctl(msgqid,I

6、PC_RMID,0); exit(0);main() int pid; Pid=fork(); If (pid0) msgqid=msgget(75, 0777);printf(“ msg id: %dn”,msgqid);pmsg.mtype=1;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“ A:receive msg from %dn,*(int *)pmsg.mtext);Else if(pid=0)signal(2,

7、cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1)msgrcv(msgqid,&pmsg,256,1,0);qid=*(int *)pmsg.mtext;printf(“ B:receive msg from %dnpmsg.mtype=qid;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);” ,qid);(2) 非父子进程之间实通过一条消息队列互相传递数据。A 进程:#include#include#include#includestruct msg

8、long mtype; char mtext256;pmsg;main()int msgqid,pid; msgqid=msgget(75, 0777);printf( “ msg id: %dn ” ,msgqid);pmsg.mtype=1;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“ A:receive msg from %dn”,*(int *)pmsg.mtext);B 进程:#include#include#in

9、clude#includeint msgqid,pid;struct msg long mtype;char mtext256;pmsg;cancelqueue() msgctl(msgqid,IPC_RMID,0);exit(0);main()signal(2,cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1) msgrcv(msgqid,&pmsg,256,1,0);pid=*(int *)pmsg.mtext;printf(“ B:receive msg from %dnpmsg.mtype=pid;*(int *)pmsg.m

10、text)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);” ,pid);4. 共享内存机制(1) 编程实现基于共享内存的进程间通信。 要求:进程 A 通过共享内存将自己的进程号传递给进程 B。A:#include#includemain()int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int *)shmat(shmid, 0,0);*va=getpid();printf(“get A s pid:%dn” ,*va);shmdt(va);B:#include#inc

11、ludemain() int shmid; int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int*)shmat(shmid, 0,0);printf(“ A s pid is :%dn” ,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);(2) 若要通过共享内存实现进程A 与进程 B 互送进程号,可怎样编程实现?#include#includemain()int shmid; int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int *

12、)shmat(shmid, 0,0);*va=getpid();printf(“ get A s pid:%dn” ,*va);Sleep(2);printf(“ B s pid is:%dn” ,*va)shmdt(va)B:#include#includemain() int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int*)shmat(shmid, 0,0);printf(“ A s pid is :%sn” ,*va);*va=getpid();printf(“ get B s pid:%dn”

13、,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);5. SOCKET 进程通信(选做)编程实现基于 SOCKET的进程间通信,通过网络实现进程之间数据通信。要求:分别编写服务器端和客户端方程序,运行于不同终端,二者可相互进行通信。Server:#include #include #include #include #include #include #include int main()int server_sockfd = -1;int client_sockfd = -1;int client_len = 0;struct sockaddr_in serve

14、r_addr;struct sockaddr_in client_addr;/ 创建流套接字server_sockfd = socket(AF_INET, SOCK_STREAM, 0);/ 设置服务器接收的连接地址和监听的端口server_addr.sin_family = AF_INET;/指定网络套接字server_addr.sin_addr.s_addr = htonl(INADDR_ANY);/server_addr.sin_port = htons(9736);/绑定到接受所有 9736 端口IP地址的连接/绑定(命名)套接字bind(server_sockfd,(structso

15、ckaddr*)&server_addr,sizeof(server_addr);/ 创建套接字队列,监听套接字listen(server_sockfd, 5);/ 忽略子进程停止或退出信号signal(SIGCHLD, SIG_IGN);while(1)char ch = 0;client_len = sizeof(client_addr);printf(Server waitingn); /接受连接,创建新的套接字client_sockfd =accept(server_sockfd, (struct sockaddr*)&client_addr,&client_len);if(fork(

16、) = 0)/ 子进程中,读取客户端发过来的信息,处理信息,再发送给客户端read(client_sockfd, &ch, 1);sleep(5);ch+;write(client_sockfd, &ch, 1);close(client_sockfd);exit(0);else/ 父进程中,关闭套接字close(client_sockfd);Client:#include #include #include #include #include #include #include int main()int sockfd = -1;int len = 0;struct sockaddr_in

17、address;int result;char ch = A; /创建流套接字sockfd = socket(AF_INET, SOCK_STREAM, 0); /设置要连接的服务器的信息address.sin_family = AF_INET;/使用网络套接字address.sin_addr.s_addr = inet_addr(127.0.0.1);/服务器地址address.sin_port = htons(9736);/服务器所监听的端口len = sizeof(address);/连接到服务器result = connect(sockfd, (struct sockaddr*)&ad

18、dress, len);if(result = -1)perror(ops:clientn);exit(1);/ 发送请求给服务器write(sockfd, &ch, 1);/ 从服务器获取数据read(sockfd, &ch, 1);printf(char form server = %cn, ch);close(sockfd);exit(0);四 . 思考与总结(1) 请对比下列程序与实验 1(1) 在按下 Ctrl+C 之后的运行现象。int k=1;int main(void)while(k=1)printf(“ how are you?n” );printf(“Byebye!n” )

19、;(2)针对实验2(2),你能否通过信号量机制来实现?若能,请给出相应代码及运行结果分析。#include #include #include#include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;arg;/ 生成信号量int sem_creat(key_t key)int semid;semid = semget(key,1,IPC_CREAT|0666);if (-1 = semid)printf(create semaphore errorn);exit(-1);sem.val = 0;semctl(semid,0,SETVAL,arg);return semid;/ 删除信号量void del_sem(int semid)arg.val = 0;semctl(semid,0,IPC_RMID,arg);/pint p(int semid)struct sembuf sops=0,-1,IPC_NOWAIT;return

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论