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

下载本文档

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

文档简介

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

2、信号处理函数While(k=1)Printf( “how are you?n ”);Printf( “byebye!” );(2)使用信号机制实现父子进程同步,父进程先输出A,然后子进程输出B。#in clude<sig nal.h>#in clude<stdio.h> int k=1;void fun c(i nt sig) k=0; main () int pid;pid=fork();if(pid>0) printf( “ An ”); kill(pid,12);else if(pid=0) sig nal(12,fu nc); while(k=1) sle

3、ep(1);printf( “ Bn ” );2. 管道机制(1)父子进程通过管道传送一串字符。要求:子进程随机从键盘输入一串字符,通过管 道发给父进程,父进程从管道中将消息读出并显示出来。#in clude<stdio.h>#in clude< uni std.h>main ()in t pid, fd2;char outpipe50,in pipe50;pipe(fd);pid=fork();if (pid=0) Printf( “ please in put some message:r” );Fgets(i npipe,sizeof( in pipe),stdi

4、 n); write(fd1,in pipe,50);else if (pid>0); wait(0);Printf( “father get this message:n”); read(fd0,outpipe,50);printf( “ sn” ,outpipe);rootzzw # vi 2*croot(?zzw zzwj# gcc -o 2 2.c root(?zzw zzw# /2 please input ome message: 1223father get this message:1223I am child.(2)父子进程通过管道互相发送字符串。要求:子进程向父进程通

5、过管道发送”父进程回送” I am father. ”,父子进程将各自收到的字符串显示在屏幕上。#in lcude<stdio.h>#in clude< uni std.h> #in clude<stri ng.h>main ()in t pid, fd2;char str150, str250;pipe(fd); pid=fork();if (pid=0) strcpy(str1, ” I' m child ” ); write(fd1,str1,strle n(str1);Sleep(1); read(fd0,str2,50);printf( “

6、 Child received: %sn ” ,str2); else if (pid>0)read(fd0,str1,50);printf( “ Pare nt received:%sn”,str1); strcpy(str2, ” I' m father.” ); write(fd1,str2,strle n( str2);3. 消息队列机制(1)父进程及其子进程通过一条消息队列互相传送数据。#in clude<stdio.h>#in clude<sys/ipc.h>#in clude<sys/msg.h>#in clude<sys/

7、types.h>int msgqid,qid;struct msg long mtype;char mtext256;pmsg;can celqueue() msgctl(msgqid,IPC_RMID,O);exit(O);main () int pid;Pid=fork();If (pid>0) msgqid=msgget(75, 0777);printf( “msg id: %dn ”,msgqid);pmsg.mtype=1;*(i nt *)pmsg.mtext)=getpid();msgs nd(msgqid,&pmsg,sizeof( in t),0); ms

8、grcv(msgqid,&pmsg,256,getpid(),0);printf( “A:receive msg from %dn",*(int *)pmsg.mtext);Else if(pid=0)sig nal(2,ca ncel queue);msgqid=msgget(75, 0777|IPC_CREAT);while(1)msgrcv(msgqid, &pmsg,256,1,0);qid=*(i nt *)pmsg.mtext;printf( “ B:receive msg from %dn ” ,qid); pmsg.mtype=qid;*(i nt *

9、)pmsg.mtext)=getpid();msgs nd(msgqid,&pmsg,sizeof( in t),0);(2)非父子进程之间实通过一条消息队列互相传递数据。A进程:#in clude<stdio.h>#in clude<sys/ipc.h>#in clude<sys/msg.h>#in clude<sys/types.h>struct msg long mtype;char mtext256;pmsg;main () int msgqid,pid;msgqid=msgget(75, 0777);printf( “ msg

10、id: %dn ”,msgqid);pmsg.mtype=1;*(i nt *)pmsg.mtext)=getpid();msgs nd(msgqid, &pmsg,sizeof( in t),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf( “A:receive msg from %dn ” ,*(int *)pmsg.mtext);B进程:#in clude<stdio.h>#in clude<sys/ipc.h>#in clude<sys/msg.h>#in clude<sys/type

11、s.h>int msgqid,pid;struct msg long mtype;char mtext256;pmsg;can celqueue() msgctl(msgqid,IPC_RMID,0);exit(0);main ()sig nal(2,ca ncel queue);msgqid=msgget(75, 0777|IPC_CREAT);while(1) msgrcv(msgqid, &pmsg,256,1,0);pid=*(i nt *)pmsg.mtext;printf( “B:receive msg from %dn ” ,pid); pmsg.mtype=pid

12、;*(i nt *)pmsg.mtext)=getpid();msgs nd(msgqid,&pmsg,sizeof( in t),0);iz'y -insg id« 131072 recei ve ihe rram 2S96rdnlfci% zi | |I B: recet ve 広洱 f rora 2994 丄mnt那刊疋石 |# ./bB:receive irg: Lrora 2yy? rdotUl22lA zzw= I4. 共享存机制(1)编程实现基于共享存的进程间通信。要求:进程 A通过共享存将自己的进程号传递 给进程B。A:#in clude<std

13、io.h>#in clude<sys/shm.h>main () int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(i nt *)shmat(shmid, 0,0);*va=getpid();printf( “ get A' s pid:%dn ” ,*va);shmdt(va);B:#in clude<stdio.h>#in clude<sys/shm.h>main () int shmid;int *va; shmid=shmget(22,sizeof(*va

14、),0666|IPC_CREAT); va=(i nt*)shmat(shmid, 0,0);printf( “ A' s pid is :%dn ”,*va); shmdt(va);shmctl(shmid,IPC_RMID,O);(2)若要通过共享存实现进程A与进程B互送进程号,可怎样编程实现?A:#in clude<stdio.h>#in clude<sys/shm.h>main () int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(i nt *)shmat(shmid,

15、 0,0);*va=getpid();printf( “get A' s pid:%dn ”,*va);Sleep(2);printf( “ B' s pid is:%dn ” ,*va) shmdt(va)B:#in clude<stdio.h>#in clude<sys/shm.h>main () int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(i nt*)shmat(shmid, 0,0);printf( “A' s pid is :%sn ”,*va);*

16、va=getpid();printf( “get B' s pid:%dn ” ,*va);shmdt(va);shmctl(shmid,IPC_RMID,O);rtw./a get 's piid:31_7B'b pid;312SL rtxjz工工矿户|rooiizzw 工刊若./bA's 口id gel bis:3l27口 id:3L28:w zzw |5. SOCKET进程通信(选做)编程实现基于 SOCKET的进程间通信,通过网络实现进程之间数据通信。要求:分别编写服务器端和客户端方程序,运行于不同终端,二者可相互进行通信。Server:#in clud

17、e <uni std.h>#in clude <sys/types.h>#in clude <sys/socket.h>#in clude <n eti net/in.h>#in clude <sig nal.h>#in clude <stdio.h>#in clude <stdlib.h>int mai n()int server_sockfd = -1;int clie nt_sockfd = -1;int clie nt_le n = 0;struct sockaddr_i n server_addr;s

18、truct sockaddr_i n clie nt_addr;/创建流套接字server_sockfd = socket(AFN ET, SOCK_STREAM, 0);/设置服务器接收的连接地址和监听的端口server_addr.sin_family = AF_INET;/ 指定网络套接字 = htonl(INADDR_ANY); 接受所有 IP 地址的连接 server_addr.sin_port = htons(9736); 绑定到 9736 端口/绑定(命名)套接字bin d(server_sockfd,(struct sockaddr* )& server_addr, si

19、zeof(server_addr);/创建套接字队列,监听套接字liste n( server_sockfd, 5);/忽略子进程停止或退出信号sig nal(SIGCHLD, SIG_IGN);while(1)char ch = '0:clie nt_le n = sizeof(clie nt_addr);prin tf("Server waiti ngn");/接受连接,创建新的套接字clie nt_sockfd = accept(server_sockfd, (struct sockaddr* )&clie nt_addr, &clie nt_

20、le n);if(fork() = 0)子进程中,读取客户端发过来的信息,处理信息,再发送给客户端read(clie nt_sockfd, &ch, 1);sleep(5);ch+;write(clie nt_sockfd, &ch, 1);close(clie nt_sockfd);exit(0);else/父进程中,关闭套接字close(clie nt_sockfd);Clie nt:#in clude <uni std.h>#in clude <sys/types.h>#in clude <sys/socket.h>#in clude

21、<n eti net/in.h>#in elude <arpa/i net.h>#in elude <stdio.h>#in elude <stdlib.h>int mai n()int soekfd = -1;in t le n = 0;struct sockaddr_i n address;int result;char ch = 'A'/创建流套接字soekfd = socket(AF_INET, SOCK_STREAM, 0);/ 设置要连接的服务器的信息address.sin_family = AF_INET;/ 使用网

22、络套接字= 服务器地址 address.sin_port = htons(9736); 服务器所监听的端口len = sizeof(address);连接到服务器result = conn ect(sockfd, (struct sockaddr* )& address, le n);if(result = -1)perror("ops:clie ntn ”);exit(1);/发送请求给服务器write(sockfd, &ch, 1);/从服务器获取数据read(sockfd, &ch, 1);prin tf("char form server =

23、 %cn", ch);close(sockfd);exit(0);四.思考与总结(1) 请对比下列程序与实验1(1)在按下Ctrl+C之后的运行现象。int k=1;int mai n(void)while(k=1) printf( “ how are you?n ” );printf( “ Byebye!n ” );(2) 针对实验2(2),你能否通过信号量机制来实现?若能,请给出相应代码及运行结果 分析。#in elude <sys/sem.h>#in clude <sys/ipc.h>#i nclude<stdio.h>#in clude &

24、lt;sys/types.h>#in clude <sys/shm.h>#in clude <stri ng.h>union semu nint val;struct semid_ds *buf;un sig ned short *array;arg;/生成信号量int sem_creat(key_t key)int semid;semid = semget(key,1,IPC_CREAT|0666);if (-1 = semid)prin tf("create semaphore errorn"); exit(-1);sem.val = 0;semctl(semid,O,SETV AL,arg);return semid;删除信号量void del_sem(i nt semi

温馨提示

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

评论

0/150

提交评论