Linux进程通信实验报告
进程间通信实验报告

软件学院计算机课程实验报告册课程名称计算机操作系统实验学期 2011 年至 2012 年第 2 学期学生所在院(系)软件学院年级 11软件专业班级软工(1)班学生姓名朱水云学号 **********指导教师陈自刚实验最终成绩软件学院实验室制2012 年 4 月实验报告( 二 ) 实验名称:进程间通信实验时间:2012年4月18号实验性质应用性设计性综合性5,观察运行结果,并思考6,退出中断并写出实验报告调试过程:根据编译提示的错误进行修改四、实验结果:1消息的发送和接受运行结果:2.共享存储区的创建、附接和段接运行结果:五、疑难与小结:1.消息的创建,发送和接收小结:从理想的结果来说,应当是每当Client发送一个消息后,server 接收该消息,Client再发送下一条。
也就是说“(Client)sent”和“(server)received”的字样应该在屏幕上交替出现。
实际的结果大多是,先由 Client 发送两条消息,然后Server接收一条消息。
此后Client Server交替发送和接收消息.最后一次接收两条消息. Client 和Server 分别发送和接收了10条消息,与预期设想一致message的传送和控制并不保证完全同步,当一个程序不再激活状态的时候,它完全可能继续睡眠,造成上面现象,在多次send message 后才 receive message.这一点有助于理解消息转送的实现机理.2.共享存储区的创建、附接和段接运行的结果和预想的完全一样。
但在运行的过程中,发现每当client 发送一次数据后,server要等大约0.1秒才有响应。
同样,之后client又需要等待大约0.1秒才发送下一个数据。
出现上述的应答延迟的现象是程序设计的问题。
当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。
此时,client端并没有放弃系统的控制权,仍然占用CPU的时间片。
(完整版)试验三、linux的进程间通信

试验三、linux的进程间通信试验目的:1、理解linux的进程间通信机制2、掌握和使用消息队列实现进程间通信3、掌握和使用共享主存实现进程间通信4、掌握何使用信号量实现进程同步背景知识介绍:linux继承了unix v的进程间通信机制,即消息队列、信号量和共享主存。
通常把消息、信号量和共享主存统称为system v ipc对象或ipc资源。
系统在进程请求ipc对象时在内核动态创建一个ipc数据结构并初始化,该结构定义了对该ipc对象访问的许可权,每个对象都具有同样类型的接口-函数,这组函数为应用程序提供3种服务:通过信号量实现与其他进程的同步通过消息队列以异步方式为通信频繁但数据量少的进程间通信提供服务通过共享主存,为大数据量的进程间通信提供服务1、共性描述1.1、公有的数据结构每一类ipc资源都有一个ipc_ids结构的全局变量用来描述同一类资源的共用数据,三种ipc对象对应的三个全局变量分别是semid_ds,msgid_ds 和shmid_ds。
ipc_ids结构定义如下:struct ipc_ids{int size; /*entries数组的大小*/int in_use; /*entries数组已使用的元素个数*/int max_id;unsigned short seq;unsigned short seq_max;struct semaphore sem; /*控制对ipc_ids结构的访问*/spinlock_t ary; /*自旋锁控制对数组entries的访问*/struct ipc_id* entries;};struct ipc_id{ struct ipc_perm *p;};每个ipc对象都有一个ipc_perm数据结构,用于描述其属性。
struct ipc_perm{__key_t __key; /* ipc键*/__uid_t uid; /* Owner's user ID. */__gid_t gid; /* Owner's group ID. */__uid_t cuid; /* Creator's user ID. */__gid_t cgid; /* Creator's group ID. */unsigned short int mode;/* Read/write permission. */unsigned short int __seq;/* Sequence number. */};每一个ipc对象都有一个32位的ipc键和一个ipc标识符,ipc标识符由内核分配给ipc对象,在系统内部惟一,IPC机制提供了相应的编程接口根据IPC键值获取标识符。
实验五 进程通信

(2)读管道 在管道创建后,希望从管道中读取数据的进程使 用读文件描述符fd[0]作为参数,调用read( )系统调用。 #include <unistd.h> ssize_t read(int fd,void *buf,size_t nbytes); 返回:读到的字节数,若已到文件尾为0,若出错 为-1。 (3)写管道 向管道中写入数据的进程使用写文件描述符fd[1] 作为参数,调用write( )系统调用。 #include <unistd.h> ssize_t write(int fd,const void *buf,size_t nbytes); 返回:若成功为已写的字节数,若出错为-1。
2. 管道是UNIX系统中最早为两个进程之间提 供的一种通信机制。管道是一种单向的、先入 先出的、无结构的、大小固定的通信通道。写 进程在管道的一端写入数据,读进程从管道的 另一端读出数据。如果两个或多个进程同时对 一个进程进行读写,那么这些进程必须使用锁 机制或者信号量机制对其进行同步。 管道分为无名管道和有名管道。无名管道 没有名字,所以只能提供给进程家族中的父子 进程间通信使用,而有名管道则用于没有家族 关系的任意两个进程之间的通信。
wait(0); read(fd[0], inpipe, 50); printf(“%s\n”, inpipe); wait(0); read(fd[0], inpipe, 50); printf(“%s\n”, inpipe); exit(0);
}
} }Байду номын сангаас四. 试验总结
1. 写出试验报告。 2. 为程序添加注释。 3. 分析信号通信和管道通信各自的特点。
2. 编写一段程序,实现进程的管道通信。 使用系统调用pipe( )建立一条管道,创建两个子进程 P1和P2。 让P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程则从管道中读出来自于两个子进程的信息, 显示在屏幕上。要求:父进程先接受子进程P1发来的 消息,然后再接受子进程P2发来的消息。 参考程序如下:
实验五 Linux进程间通信05010501

lockf(fd[1],0,0); exit(0); } else{ wait(0); read(fd[0],InPipe,50); printf("%s\n",InPipe); wait(0); read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); } } } 实验要求:运行程序并分析结果,将上面程序修改成,在父进程中用 pipe()建立一条管道, 往管道里写字符串,两个子进程分别接收父进程往管道里写的字符串。
lockf(fd[1],1,0); sprintf(OutPipe, "child 1 process is sending message!"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else{
while((pid2=fork())== -1); if(pid2 == 0) {
//printf("child2 exit status is %d\n", WEXITSTATUS(status2));
printf("parent process is killed!\n");
exit(0);
} else{
/*在子进程 2 中*/
wait_mark=1; signal(12,stop); //捕捉到中断信号 12 后,调用 stop 函数
实验二 Linux进程通信

实验二 Linux进程通信一、实验目的1)了解有关Linux系统调用;2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。
二、实验内容在Linux环境下,用C/C++语言编程,使用系统调用fork创建进程多个子进程。
(1) 调试并完成下列程序,完成实验要求:#include "stdio.h"#include "sys/types.h"#include "unistd.h"int main(){pid_t pid1;pid_t pid2;pid1 = fork();pid2 = fork();printf("pid1:%d, pid2:%d\n", pid1, pid2);}要求:A.请说出执行这个程序后,将一共运行几个进程。
B.观察运行结果,并给出分析与解释。
答:A.执行这个程序后,将一共运行4个进程。
A.运行结果如下:分析与解释:fork()函数能够建立子进程,且使得子进程得到父进程地址空的一个复制;而且,当创建成功时,如果是父进程则返回0,子进程则返回子进程的I D,但是,fork()创建的进程并不是从该程序开头开始执行,它只是和父进程一样继续执行后续代码,因此在之后的语句中,父子进程同时创建一个进程,就形成了四个进程,如图上所示。
所以,,在上面的截图中,第一次fork()函数时成功产生了父子进程pid分别为2775和0,第二次使用fork()函数时父子进程又各产生了一对父子进程父进程产生的父子进程的pid分别为2776和0,子进程产生的父子进程的pid分别为0和2777。
因为进程是并发的,他的调度我们无法干预,所以出现的结果并非都是一成不变的,执行多次后,输出的顺序有可能不一样。
(2)参考下面的相关程序实例,编写一个管道实验程序,实现两个进程之间的数据通信。
要求:父进程顺序写入若干个字符串,子进程顺序读出内容,并写入文件piple.txt,并显示出来。
实验八-Linux进程间通信——管道与信号

if((fd = open("file.fifo",O_RDWR)) == -1){ printf("open FIFO failed\n"); exit(2);
} if((rtn = write(fd,argv[1],strlen(argv[1]) + 1)) == -1){
printf("write failed\n"); exit(3);
int fd; char info[128] = {0}; if((fd = open("file.fifo",O_RDWR)) == -1){
printf("open FIFO failed\n"); exit(1); }
if(read(fd,info,sizeof(info)) == -1){ printf("read failed\n"); exit(2);
}
if((fd = open("file.fifo",O_RDWR)) == -1){ printf("open FIFO failed\n"); exit(2);
} if((rtn = write(fd,argv[1],strlen(argv[1]) + 1)) == -1){
printf("write failed\n"); exit(3); } pause(); return 0; }
《嵌入式操作系统应用开发》 课程实验报告
班 级: **************** 学 号: ************* 姓 名:************** 指导老师: *************** 成 绩:
实验三2_Linux进程间通信

实验三2_Linux进程间通信实验三 Linux进程间通信一、实验目的熟悉Linux下进程间通信机制,能够使用系统提供的各种通信机制实现并发进程间的数据交换。
二、实验题目分别使用Linux下的共享存储区、消息、管道等通信机制,编程实现并发进程之间的相互通信。
三、背景材料(一)需要用到的系统调用实验可能需要用到的主要系统调用和库函数在下面列出,详细的使用方法说明通过“man 2 系统调用名”或者“man 3 函数名”命令获取。
fork() 创建一个子进程,通过返回值区分是在父进程还是子进程中执行;wait() 等待子进程执行完成;getpid() 获取当前进程id;shmget() 建立一个共享存储区;shmctl() 操纵一个共享存储区;shmat() 把一个共享存储区附接到进程内存空间;shmdt() 把一个已经附接的共享存储区从进程内存空间断开;msgget() 建立一个消息队列;msgctl() 操纵一个消息队列;msgsnd() 发送消息;msgrcv() 接收消息;signal() 设置对信号的处理方式或处理过程;pipe() 打开管道;lockf() 锁定一个文件。
(二)使用共享存储区的示例程序下面程序主要用来演示共享存储区的使用方法:首先要使用shmget得到共享存储区句柄(可以新建或连接已有的共享存储区,以关键字标识),然后使用shmat挂接到进程的存储空间(这样才能够访问),当使用完后,使用shmctl释放(shmctl 还可以完成一些其他功能)。
这种使用逻辑也适用于消息和信号量。
示例程序代码如下:#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>int main(void){int x, shmid;int *shmptr;if((shmid=shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0666)) < 0) printf("shmget error"), exit(1);//函数原型int shmget(key_t key,int size,int shmflg); 函数用于创建(或者获取)一key键值指定的共享内存对象,返回该对象的系统标识符:shmid;size 是创个由IPC_CREAT|0666,说明新建一个权限为0666的消息队列,建的共享内存的大小,id,若其中组用户、当前用户以及其他用户拥有读写的权限若成功则返回共享内存-1 出错则为if((shmptr=(int *)shmat(shmid, 0, 0)) == (int *)-1)printf("shmat error"), exit(1);// void *shmat(int shm_id,void *shm_addr,int shmflg); shm_id标识码,shm_addr连,shmflg标志位接到的地址printf("Input a initial value for *shmptr: ");scanf("%d", shmptr);while((x=fork())==-1);if(x==0) /* child run */{printf("When child runs, *shmptr=%d\n", *shmptr);printf("Input a value in child: ");scanf("%d", shmptr);printf("*shmptr=%d\n", *shmptr);}else /* parent run */{wait();printf("After child runs, in parent, *shmptr=%d\n", *shmptr);if ( shmctl(shmid, IPC_RMID, 0) < 0 )// shmctl()函数声明:int shmctl(int shmqid, int cmd, struct shmid_ds *buf);返回值:0 on success函数用于对已创建的共享内存对象进行查询、设值、删除等操作;这个函数-1 on error:和 msgget()函数十分相似,用法也相同。
进程的管道通信实验报告

进程的管道通信实验报告一、实验目的本实验旨在通过实际操作,深入理解进程间通信(IPC)的原理,掌握管道通信的实现方法,提高对操作系统进程管理的理解。
二、实验环境实验环境为Linux操作系统,使用Shell脚本进行进程的管道通信实验。
三、实验内容1. 创建两个Shell脚本文件,分别命名为sender.sh和receiver.sh。
2. 在sender.sh中,编写一个简单的程序,用于向管道中写入数据。
程序包括一个无限循环,每次循环中随机生成一个数字并写入管道。
3. 在receiver.sh中,编写一个简单的程序,用于从管道中读取数据。
程序同样包括一个无限循环,每次循环中从管道中读取一个数字并输出。
4. 使用Shell命令将sender.sh和receiver.sh链接起来,实现进程间的管道通信。
四、实验过程1. 打开两个终端窗口,分别用于运行sender.sh和receiver.sh。
2. 在第一个终端窗口中,输入命令“bash sender.sh”运行sender.sh脚本。
该脚本将创建一个无限循环,每次循环中随机生成一个数字并写入管道。
3. 在第二个终端窗口中,输入命令“bash receiver.sh”运行receiver.sh脚本。
该脚本将创建一个无限循环,每次循环中从管道中读取一个数字并输出。
4. 观察两个终端窗口的输出,可以看到sender.sh进程向管道中写入的数字被receiver.sh进程读取并输出。
五、实验总结通过本次实验,我们成功实现了进程间的管道通信。
在实验过程中,我们深入了解了进程间通信的原理和实现方法,掌握了管道通信的基本操作。
通过实际操作,我们更好地理解了操作系统中进程管理、进程间通信的相关知识。
同时,我们也发现了一些不足之处,例如在程序中没有添加异常处理机制等。
在今后的学习中,我们将继续深入探索进程间通信的相关知识,提高自己的编程技能和系统设计能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux进程通信实验报告
一、 实验目的和要求
1. 进一步了解对进程控制的系统调用方法。
2. 通过进程通信设计达到了解UNIX或Linux系统中进程通信的基本原理。
二、 实验内容和原理
1. 实验编程,编写程序实现进程的管道通信(设定程序名为pipe.c)。使
用系统调用pipe()建立一条管道线。而父进程从则从管道中读出来自
于两个子进程的信息,显示在屏幕上。要求父进程先接受子进程P1
发来的消息,然后再接受子进程P2发来的消息。
2. 可选实验,编制一段程序,使其实现进程的软中断通信(设定程序名为
softint.c)。使用系统调用fork()创建两个子进程,再用系统调用
signal()让父进程捕捉键盘上来的中断信号(即按Del键),当父进程
接受这两个软中断的其中一个后,父进程用系统调用kill()向两个子
进程分别发送整数值为16和17的软中断信号,子进程获得对应软中
断信号后分别输出相应信息后终止。
三、 实验环境
一台安装了Red Hat Linux 9操作系统的计算机。
四、 实验操作方法和步骤
进入Linux操作系统,利用vi编辑器将程序源代码输入并保存好,然后
打开终端对程序进行编译运行。
五、 实验中遇到的问题及解决
六、 实验结果及分析
基本实验
可选实验
七、 源代码
Pipe.c
#include"stdio.h"
#include"unistd.h"
main(){
int i,j,fd[2];
char S[100];
pipe(fd);
if(i=fork==0){
sprintf(S,"child process 1 is sending a message \n");
write(fd[1],S,50);
sleep(3);
return;
}
if(j=fork()==0){
sprintf(S,"child process 2 is sending a message \n");
write(fd[1],S,50);
sleep(3);
return;
}else{
wait(0);
read(fd[0],S,50);
printf("%s",S);
read(fd[0],S,50);
printf("%s",S);
return;
}
}
Softint.c
#include"stdio.h"
#include"unsitd.h"
main(){
int i,j,fd[2];
char S[100];
pipe(fd);
if(i=fork==0){
sprintf(S,"child process 1 is sending a message \n");
write(fd[1],S,50);
sleep(3);
return;
}
if(j=fork()==0){
sprintf(S,"child process 2 is sending a message \n");
write(fd[1],S,50);
sleep(3);
return;
}else{
wait(0);
read(fd[0],S,50);
printf("%s",S);
read(fd[0],S,50);
printf("%s",S);
return;
}
}