2022年实验三进程通信终稿 .pdf

上传人:Che****ry 文档编号:27194134 上传时间:2022-07-23 格式:PDF 页数:12 大小:364.26KB
返回 下载 相关 举报
2022年实验三进程通信终稿 .pdf_第1页
第1页 / 共12页
2022年实验三进程通信终稿 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年实验三进程通信终稿 .pdf》由会员分享,可在线阅读,更多相关《2022年实验三进程通信终稿 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、are you?n” ); Printf(“byebye! ”); (2) 使用信号机制实现父子进程同步,父进程先输出A,然后子进程输出B。#include #include int k=1; void func(int sig) k=0; main() int pid; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - pid=fork(); if(pid0) printf(“An ”); kill(pid,12); else

3、 if(pid=0) signal(12,func); while(k=1) sleep(1); printf(“Bn ”); 2. 管道机制(1) 父子进程通过管道传送一串字符。要求: 子进程随机从键盘输入一串字符,通过管道发给父进程,父进程从管道中将消息读出并显示出来。#include #include main() int pid, fd2 ; char outpipe50, inpipe50; pipe(fd); pid=fork(); if (pid=0) Printf(“please input some message:n”); Fgets(inpipe,sizeof(inpip

4、e),stdin); write(fd1,inpipe,50); else if (pid0); wait(0); Printf(“father get this message:n”); read(fd0,outpipe,50); printf(“%sn”,outpipe); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - (2)父子进程通过管道互相发送字符串。要求:子进程向父进程通过管道发送”I am child.”,父进

5、程回送”I am father.”,父子进程将各自收到的字符串显示在屏幕上。#inlcude #include #include main() 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 received: %sn”,str2); else if (pid0) read(fd0,str1,50); prin

6、tf(“Parent received:%sn”,str1); strcpy(str2,”I m father.”); write(fd1,str2,strlen(str2); 3. 消息队列机制(1) 父进程及其子进程通过一条消息队列互相传送数据。#include #include #include #include int msgqid,qid; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - struct msg lon

7、g mtype; char mtext256; pmsg; cancelqueue() msgctl(msgqid,IPC_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:

8、receive msg from %dn,*(int *)pmsg.mtext); Else if(pid=0) signal(2,cancelqueue); msgqid=msgget(75, 0777|IPC_CREAT); while(1) msgrcv(msgqid,&pmsg,256,1,0); qid=*(int *)pmsg.mtext; printf(“ B:receive msg from %dn”,qid); pmsg.mtype=qid; *(int *)pmsg.mtext)=getpid(); msgsnd(msgqid,&pmsg,sizeof(int),0); (

9、2) 非父子进程之间实通过一条消息队列互相传递数据。A进程:#include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - #include #include #include struct msg long mtype; char mtext256; pmsg; main() int msgqid,pid; msgqid=msgget(75, 0777); printf(“msg id: %dn”,msgqid); pms

10、g.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 #include #include int msgqid,pid; struct msg long mtype; char mtext256; pmsg; cancelqueue() msgctl(msgqid,IPC_R

11、MID,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 %dn” ,pid); pmsg.mtype=pid; *(int *)pmsg.mtext)=getpid(); msgsnd(msgqid,&pmsg,sizeof(int),0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - -

12、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 4. 共享内存机制(1) 编程实现基于共享内存的进程间通信。要求:进程 A通过共享内存将自己的进程号传递给进程B。A: #include #include main() 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);

13、shmdt(va); B: #include #include main() int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int*)shmat(shmid, 0,0); printf(“As pid is :%dn”,*va); shmdt(va); shmctl(shmid,IPC_RMID,0); (2) 若要通过共享内存实现进程A与进程 B互送进程号,可怎样编程实现?A: #include #include main() int shmid; int *va; 名师资料总结 - - -精品资料欢

14、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int *)shmat(shmid, 0,0); *va=getpid(); printf(“get A s pid:%dn”,*va); Sleep(2); printf(“Bs pid is:%dn”,*va) shmdt(va) B: #include #include main() int shmid; in

15、t *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int*)shmat(shmid, 0,0); printf(“As pid is :%sn”,*va); *va=getpid(); printf(“get B s pid:%dn”,*va); shmdt(va); shmctl(shmid,IPC_RMID,0); 5. SOCKET进程通信(选做)编程实现基于SOCKET 的进程间通信,通过网络实现进程之间数据通信。要求:分别编写服务器端和客户端方程序,运行于不同终端,二者可相互进行通信。Server: #include #i

16、nclude #include #include #include #include #include int main() int server_sockfd = -1; int client_sockfd = -1; int client_len = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - struct sockaddr_in server_addr; struct sockaddr_in client_ad

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

18、of(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() = 0) /子进程中,读取

19、客户端发过来的信息,处理信息,再发送给客户端 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - -

20、 - - - - - #include #include #include #include int main() int sockfd = -1; int len = 0; struct sockaddr_in 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);/服务器地址 add

21、ress.sin_port = htons(9736);/服务器所监听的端口 len = sizeof(address); /连接到服务器 result = connect(sockfd, (struct sockaddr*)&address, 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);

22、四. 思考与总结(1) 请对比下列程序与实验1(1) 在按下 Ctrl+C 之后的运行现象。int k=1; int main(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - while(k=1) printf(“how are you?n”); printf(“Byebye!n ”); (2) 针对实验2(2) ,你能否通过信号量机制来实现?若能,请给出相应代码及运行结果分析。#include #include

23、#include #include #include #include union semun int 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

24、; / 删除信号量void del_sem(int semid) arg.val = 0; semctl(semid,0,IPC_RMID,arg); /p int p(int semid) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - struct sembuf sops=0,-1,IPC_NOWAIT; return (semop(semid,&sops,1); /v int v(int semid) struct s

25、embuf sops=0,+1,IPC_NOWAIT; return (semop(semid,&sops,1); int main() key_t key; int pid,semid; char str150; struct semid_ds buf; key = ftok(/,0); semid = sem_creat(key); if(pid0) P(semid); Va=(char *)shmat(shmid,0,0); Printf(“father get this message:%sn”,va); Strcpy(va,”I m father!”); Printf(“father

26、 get this message:%sn”,str1); Shmat(va); V(semid); Else if(pid=0) P(semid); Va=(char *)shmat(shmid,0,0); Strcpy(va,”I m child!”); Sleep(2); Printf(“child get this message:%sn”,va); Shmat(va); V(semid); Shmctl(shmid,IPC_RMID,0); del_sem(semid); return 0; /gcc -o shm shm.c -g 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - (3) 请结合本次实验,说明信号、管道、消息队列、共享内存这几种进程间通信机制的适用场合及其优缺点。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁