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

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论