




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 进程通信学校:FJUT 学号:3131903229 班级:计算机1302 姓名:姜峰一. 实验学时与类型学时:2,课外学时:自定实验类型:设计性实验二. 实验目的了解Linux的软中断、管道、消息队列、共享存储区等进程间通信方式。三. 实验内容1. 软中断通信机制(1) 请编写一个程序:循环输出“how are you?”,在按下Ctrl+C后中断显示,输出“Byebye!”后退出程序。源代码:#include <stdio.h>#include <signal.h>int flag = 1;void Soft_Interrupt() flag = 0; ret
2、urn;int main() signal( 2, Soft_Interrupt ); while( flag ) printf( "how are you?n" ); printf( "Byebye!" ); return 0;运行结果截图:(2) 使用软中断机制实现父子进程同步,父进程先输出A,然后子进程输出B。源代码:#include <stdio.h>#include <unistd.h>#include <signal.h>int flag = 1;void Soft_Interrupt() flag = 0
3、; return;int main() int pid = fork(); if( pid > 0 ) printf( "I am father:An" ); kill( pid, 10 ); else if( pid = 0 ) signal( 10, Soft_Interrupt ); while( flag ) sleep( 1 ); printf( "I am child:Bn" ); else printf( "EORROR!n" ); return -1; return 0;运行结果截图:2. 管道机制(1) 父子进
4、程通过管道传送一串字符。要求:子进程随机从键盘输入一串字符,通过管道发给父进程,父进程从管道中将消息读出并显示出来。源代码:#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main() int pid, flag, singlepipe2; char *writepipe, *readpipe; flag = pipe( singelpipe ); if( flag = -1 ) printf( "ERRORPIPE!n&quo
5、t; ); return -1; pid = fork(); if( pid > 0 ) readpipe = ( char * ) malloc( 100 * sizeof( char ) ); wait( 0 ); read( singlepipe0, readpipe, 100 ); printf( "father:%sn", readpipe ); else if( pid = 0 ) printf( "please input a period of string( stringlength<100 ):n" ); writepip
6、e = ( char * ) malloc( 100 * sizeof( char ) ); scanf( "%s", writepipe ); write( singlepipe1, writepipe, strlen( writepipe ) ); else printf( "ERRORFORK!n" ); return 0; return 1; 运行结果截图:(2) 父子进程通过管道互相发送字符串。要求:子进程向父进程通过管道发送”I am child.”,父进程回送”I am father.”,父子进程将各自收到的字符串显示在屏幕上。源代码:#i
7、nclude <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main() int pid, flag, singlepipe2; char *childpipe, *parentpipe; childpipe = ( char * ) malloc( 15 * sizeof( char ) ); parentpipe = ( char * ) malloc( 15 * sizeof( char ) ); flag = pipe( singlepipe )
8、; if( flag = -1 ) printf( "ERRORPIPE!n" ); return -1; pid = fork(); if( pid > 0 ) usleep( 100 ); read( singlepipe0, childpipe, 15 ); printf( "child say:%sn", childpipe ); strcpy( parentpipe, "I am father" ); write( singlepipe1, parentpipe, strlen( parentpipe ) ); els
9、e if( pid = 0 ) strcpy( childpipe, "I am child." ); write( singlepipe1, childpipe, strlen( childpipe ) ); sleep( 1 ); read( singlepipe0, parentpipe, 15 ); printf( "parent say:%sn", parentpipe ); else printf( "ERRORFORK!n" ); return 0; return 1;运行结果截图:3. 消息队列机制(1) 父进程及其子
10、进程通过一条消息队列互相传送数据。源代码:#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/ipc.h>#define MAXSIZE 256#define KEY 100int msgqid;typedef struct long int Mtype; char MtextMAXSIZE;Message;void Cancelqueue() if(
11、msgctl( msgqid, IPC_RMID, 0 ) < 0 ) perror( "msgctl" ); exit( 1 ); system( "ipcs -q" ); exit(0);int main() int pid; Message trmsg, Ptrmsg = &trmsg; msgqid = msgget( KEY, IPC_CREAT | 0666 ); if( msgqid < 0 ) perror( "msgget" ); exit( 1 ); else system( "ipc
12、s -q" ); pid = fork(); if( pid > 0 ) char parentMAXSIZE; signal( 2, Cancelqueue ); Ptrmsg -> Mtype = getpid(); scanf( "%s", Ptrmsg -> Mtext ); if( msgsnd( msgqid, Ptrmsg, sizeof( long int ) + strlen( Ptrmsg -> Mtext ), 0 ) < 0 ) perror( "msgsnd" ); exit( 1 );
13、else system( "icps -q" ); msgrcv( msgqid, Ptrmsg, MAXSIZE, pid, 0 ); strcpy( parent, Ptrmsg -> Mtext ); printf( "Parent:receive message from %d as: %sn", pid, parent ); else if( pid = 0 ) char childMAXSIZE; signal( 2, Cancelqueue ); msgrcv( msgqid, Ptrmsg, MAXSIZE, getppid(),
14、0 ); strcpy( child, Ptrmsg -> Mtext ); printf( "Child:receive message from %d as: %sn", getppid(), child ); Ptrmsg -> Mtype = getpid(); scanf( "%s", Ptrmsg -> Mtext ); if( msgsnd( msgqid, Ptrmsg, sizeof( long int ) + strlen( Ptrmsg -> Mtext ), 0 ) < 0 ) perror( &qu
15、ot;msgsnd" ); exit( 1 ); else system( "ipcs -q" ); else printf( "ERROR!n" ); return -1; return 0;运行结果截图: (2) 非父子进程之间实通过一条消息队列互相传递数据。Client端源代码:#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/msg.h>#include <sys/types.h>#inc
16、lude <sys/ipc.h>#define MAXSIZE 256#define KEY 100int msgqid;typedef struct long int Mtype; char MtextMAXSIZE;Message;void Cancelqueue() if( msgctl( msgqid, IPC_RMID, 0 ) < 0 ) perror( "msgctl" ); exit( 1 ); system( "ipcs -q" ); exit(0);int main() int pid; char clientMAX
17、SIZE, TempMAXSIZE; Message trmsg, *Ptrmsg = &trmsg; msgqid = msgget( KEY, IPC_CREAT | 0777 ); if( msgqid < 0 ) perror( "msgget" ); exit( 1 ); else system( "ipcs -q" ); signal( 2, Cancelqueue ); Ptrmsg -> Mtype = 10; scanf( "%s", Temp ); sprintf( Ptrmsg -> M
18、text, "Hello!this is clinet,my pid is %d my message is :%s", getpid(), Temp ); if( msgsnd( msgqid, Ptrmsg, sizeof( long int ) + strlen( Ptrmsg -> Mtext ), 0 ) < 0 ) perror( "msgsnd" ); exit( 1 ); else system( "ipcs -q" ); msgrcv( msgqid, Ptrmsg, MAXSIZE, 11, 0 );
19、strcpy( client, Ptrmsg -> Mtext ); printf( "Client:receive message from server as: %sn", client ); return 0;Server端源代码:#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/ipc.h>#define MAXSIZ
20、E 256#define KEY 100int msgqid;typedef struct long int Mtype; char MtextMAXSIZE;Message;void Cancelqueue() if( msgctl( msgqid, IPC_RMID, 0 ) < 0 ) perror( "msgctl" ); exit( 1 ); system( "ipcs -q" ); exit(0);int main() int pid; char serverMAXSIZE, TempMAXSIZE; Message trmsg, *P
21、trmsg = &trmsg; signal( 2, Cancelqueue ); msgqid = msgget( KEY, 0777 ); if( msgqid < 0 ) perror( "msgget" ); exit( 1 ); else system( "ipcs -q" ); msgrcv( msgqid, Ptrmsg, MAXSIZE, 10, 0 ); strcpy( server, Ptrmsg -> Mtext ); printf( "Server:receive message from clien
22、t as: %sn", server ); Ptrmsg -> Mtype = 11; scanf( "%s", Temp ); sprintf( Ptrmsg -> Mtext, "Hello!this is server,my pid is %d my message is :%s", getpid(), Temp ); if( msgsnd( msgqid, Ptrmsg, sizeof( long int ) + strlen( Ptrmsg -> Mtext ), 0 ) < 0 ) perror( "
23、;msgsnd" ); exit( 1 ); else system( "ipcs -q" ); return 0;分别对client和server端运行结果截图:Client端:Server端:4. 共享内存机制(选做)(1) 编程实现基于共享内存的进程间通信。要求:进程A通过共享内存将自己的进程号传递给进程B。A端源代码:#include <stdio.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/types.h>#include <sys/s
24、hm.h>#define KEY 10int main() int shmid;int *viraddr; shmid = shmget( KEY, sizeof( *viraddr ), IPC_CREAT | 0666 ); if( shmid < 0 ) perror( "shmget" ); exit( 1 ); else system( "ipcs -m" ); viraddr = ( int * ) shmat( shmid, 0, 0 ); *viraddr = getpid(); usleep( 5000 ); shmdt(
25、viraddr ); shmctl( shmid, IPC_RMID, 0 ); return 0;B端源代码:#include <stdio.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/types.h>#include <sys/shm.h>#define KEY 10int main() int shmid;int *viraddr; shmid = shmget( KEY, sizeof( *viraddr ), IPC_CREAT | 0666 ); if( s
26、hmid < 0 ) perror( "shmget" ); exit( 1 ); else system( "ipcs -m" ); viraddr = ( int * ) shmat( shmid, 0, 0 ); printf( "I am A, My pid is %dn", *viraddr ); shmdt( viraddr ); return 0;运行结果截图对比:(2) 若要通过共享内存实现进程A与进程B互送进程号,可怎样编程实现?A端源代码:#include <stdio.h>#include &l
27、t;unistd.h>#include <sys/ipc.h>#include <sys/types.h>#include <sys/shm.h>#define KEY 10int main() int shmid;int *viraddr; shmid = shmget( KEY, sizeof( *viraddr ), IPC_CREAT | 0666 ); if( shmid < 0 ) perror( "shmget" ); exit( 1 ); else system( "ipcs -m" );
28、viraddr = ( int * ) shmat( shmid, 0, 0 ); *viraddr = getpid(); usleep( 5000 ); printf( "I am B, My pid is %dn", *viraddr );shmdt( viraddr ); shmctl( shmid, IPC_RMID, 0 ); return 0;B端源代码:#include <stdio.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/types.h>#
29、include <sys/shm.h>#define KEY 10int main() int shmid;int *viraddr; shmid = shmget( KEY, sizeof( *viraddr ), IPC_CREAT | 0666 ); if( shmid < 0 ) perror( "shmget" ); exit( 1 ); else system( "ipcs -m" ); viraddr = ( int * ) shmat( shmid, 0, 0 ); printf( "I am A, My pid is %dn", *viraddr ); *viraddr = getpid(); shmdt( viraddr ); return 0;运行结果截图对比:5. SOCKET进程通信(选做)编程实现基于SOCKET的进程间通信,通过网络实现进程之间数据通信。要求:分别编写服务器端和客户端方程序,运行于不同终端,二者可相互进行通信。四. 思考与总结(1) 请对比下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江长征职业技术学院《事故调查处理与事故分析》2023-2024学年第二学期期末试卷
- 黄山职业技术学院《动画表演与运动规律》2023-2024学年第二学期期末试卷
- 阜阳幼儿师范高等专科学校《工程经济与可行性分析》2023-2024学年第二学期期末试卷
- 漳州科技职业学院《高级会计》2023-2024学年第二学期期末试卷
- XX横向课题研究与成果转化
- 新疆司法警官职业学院《智能时代下的创新创业实践》2023-2024学年第二学期期末试卷
- 邯郸应用技术职业学院《儿童文学选》2023-2024学年第二学期期末试卷
- 广东工商职业技术大学《地理学与生活》2023-2024学年第二学期期末试卷
- 自我介绍大班课件
- 西宁城市职业技术学院《中医经典金匮要略》2023-2024学年第二学期期末试卷
- 老年人支气管哮喘诊断与管理中国专家共识2020
- 全过程工程咨询管理服务方案投标方案(技术方案)
- 6.2反比例函数的图象与性质(第一课时)教学设计2024-2025学年北师大版数学九年级上册
- 煤矿单轨吊轨道安装技术规范
- DL∕T 1938-2018 垃圾发电厂炉渣处理技术规范
- 无人机编队技术的发展与应用
- 湖南省矢量地图课件模板(各市、区县地图-可编辑、配色)
- 电动车店合伙人协议
- 医疗机构消毒记录表清洁消毒日检查记录表
- 孙权劝学省公共课一等奖全国赛课获奖课件
- 小学二年级体育《快速跑》教案
评论
0/150
提交评论