ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:149.91KB ,
资源ID:10746508      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10746508.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux系统编程实验六进程间通信.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux系统编程实验六进程间通信.docx

1、Linux系统编程实验六进程间通信实验六:进程间通信 实验目的:学会进程间通信方式:无名管道,有名管道,信号,消息队列, 实验要求:(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一消息队列,实现向队列中存放数据和读取数据 实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台 实验步骤:(一)无名管道的使用1、编写实验代码pipe_rw.c#include #include #include #include #include #include int main() int

2、 pipe_fd2;/管道返回读写文件描述符 pid_t pid; char buf_r100; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r);/将buf_r初始化 char str1=”parent write1 “holle”;char str2=”parent write2 “pipe”n”; r_num=30; /*创建管道*/ if(pipe(pipe_fd)0) printf(pipe create errorn); return -1; /*创建子进程*/ if(pid=fork()=0) /子进程执行代码 /1、子进

3、程先关闭了管道的写端close(pipe_fd1); /2、让父进程先运行,这样父进程先写子进程才有内容读sleep(2); /3、读取管道的读端,并输出数据if(read(pipe_fd0,buf_r, r_num)0) /父进程执行代码 /1、父进程先关闭了管道的读端close(pipe_fd0); /2、向管道写入字符串数据p_wbuf=&str1;write(pipe_fd1,p_wbuf,sizof(p_wbuf);p_wbuf=&str2;write(pipe_fd1,p_wbuf,sizof(p_wbuf); /3、关闭写端,并等待子进程结束后退出 close(pipe_fd1)

4、; return 0;/*#include #include #include #include #include #include int main() int pipe_fd2;/管道返回读写文件描述符 pid_t pid; char buf_r100; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r);/将buf_r初始化 char str1=holle; char str2=pipe; r_num=10; /*创建管道*/ if(pipe(pipe_fd)0) printf(pipe create errorn); return

5、 -1; /*创建子进程*/ if(pid=fork()=0) /子进程执行代码 close(pipe_fd1);/1、子进程先关闭了管道的写端 /2、让父进程先运行,这样父进程先写子进程才有内容读 /3、读取管道的读端,并输出数据 if(read(pipe_fd0,buf_r, r_num)0) printf(read1 error!); exit(-1); printf(nparent write1 %s!,buf_r); sleep(1); if(read(pipe_fd0,buf_r, r_num)0) /父进程执行代码 close(pipe_fd0);/1、父进程先关闭了管道的读端

6、p_wbuf=str1;/2、向管道写入字符串数据 write(pipe_fd1,p_wbuf,sizeof(str1); sleep(1); p_wbuf=str2; write(pipe_fd1,p_wbuf,sizeof(str2); close(pipe_fd1);/3、关闭写端,并等待子进程结束后退出 exit(1); /printf(father error!); return 0;*/2、编译应用程序pipe_rw.c3、运行应用程序子进程先睡两秒让父进程先运行,父进程分两次写入“hello”和“pipe”,然后阻塞等待子进程退出,子进程醒来后读出管道里的内容并打印到屏幕上再退出

7、,父进程捕获到子进程退出后也退出4、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最后关掉读端,读的进程最好关闭掉写端(二)信号处理1、编写实验代码sig_bus.c#include #include #include /1、自定义信号处理函数,处理SIGBUS信号,打印捕捉到信号即可static void signal_handler(int signo)if(signo =SIGBUS)printf(“n I have get SIGBUS”);exit(EXIT_FAILURE);in

8、t main() printf(Waiting for signal SIGBUS n ); /2、注册信号处理函数 if(signal(SIGBUS,signal_handler)=SIG_ERR)fprintf(stderr,”cannot handle SIGBUSn”);exit(EXIT_FAILURE); pause();/将进程挂起直到捕捉到信号为止 exit(0);return 0;/*#include #include #include #include /1、自定义信号处理函数,处理SIGBUS信号,打印捕捉到信号即可static void signal_handler(i

9、nt signo) if(signo =SIGBUS) printf(I have get SIGBUS); exit(EXIT_FAILURE);int main() printf(Waiting for signal SIGBUS n ); /2、注册信号处理函数 if(signal(SIGBUS,signal_handler)=SIG_ERR) fprintf(stderr,cannot handle SIGBUSn); exit(EXIT_FAILURE); pause();/将进程挂起直到捕捉到信号为止 exit(0); return 0;*/用signal系统调用为SIGBUS信号

10、注册信号处理函数my_func,然后将进程挂起等待SIGBUS信号。所以需要向该进程发送SIGBUS信号才会执行自定义的信号处理函数2、编译应用程序sig_bus.c3、运行应用程序 先先一个终端中运行sig_bus,会看到进程挂起,等待信号然后在另一个终端中,查找到运行sig_bus这个产生的进程号,用kill命令发送SIGBUS信号给这个进程我们可以看到前面挂起的进程在接收到这个信号后的处理用自定义信号处理函数my_func来处理,所以打印了I have get SIGBUS这样一句话 上机报告要求:1、总结pipe(),signal()的函数定义原型,返回值和参数的意义表头文件: #in

11、clude定义函数: int pipe(int filedes2);函数说明(参数): pipe()会建立管道,并将文件描述词由参数filedes数组返回。filedes0为管道里的读取端,filedes1则为管道的写入端。返回值:若成功则返回零,否则返回-1,错误原因存于errno中。阻塞问题:当管道中的数据被读取后,管道为空。一个随后的read()调用将默认的被阻塞, 等待某些数据写入。功能:管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操

12、作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。表头文件:#include功 能:设置某一信号的对应动作函数原型:void (*signal(int signum,void(* handler)(int)(int); 或者:typedef void(*sig_t) ( int ); sig_t signal(int signum,sig_t handler);可看成是signal()函数(它自己是带有两个参数,一个为整型,一个为函数指针的函数),而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带整型参数,并且返回值为v

13、oid的一个函数。参数说明:第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。 第二个参数handler描述了与信号关联的动作,它可以取以下三种值: (1)一个返回值为正数的函数地址此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义: intfunc(int sig); sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数

14、。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。(2)SIGIGN 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。 (3)SIGDFL 这个符号表示恢复系统对信号的默认处理。 函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,

15、该函数的执行就会被中断。返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。 附加说明:在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。下面的情况可以产生Signal: 1. 按下CTRL+C产生SIGINT 2. 硬件中断,如除0,非法内存访问(SIGSEV)等等 3. Kill函数可以对进程发送Signal 4. Kill命令。实际上是对Kill函数的一个包装 5.软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGP

16、IPE),等等命名管道FIFO功能:管道最大的劣势就是没有名字,只能用于有一个共同祖先进程的各个进程之间。FIFO代表先进先出,单它是一个单向数据流,也就是半双工,和管道不同的是:每个FIFO都有一个路径与之关联,从而允许无亲缘关系的进程访问。 头文件:#include #include 函数定义原型:int mkfifo(const char *pathname, mode_t mode);参数:这里pathname是路径名,mode是sys/stat.h里面定义的创建文件的权限.2、利用有名管道FIFO实现类似第一个实验的功能,一个程序fifo_read.c写数据”Hi Linux”,另一

17、个程序fifo_write.c读数据并打印出来。/fifo.read.c#include #include #include #include #include #include #include #include /#define FIFO fifoint main() int fdr,fd; char buf_r=Hi Linuxn;fd=mkfifo(fifo.txt,O_CREAT|O_RDWR|0666);if(fd0)printf(fifo creat error(R)!n); exit(-1);fdr=open(fifo.txt,O_WRONLY|O_CREAT,0666);if

18、(fdr0)printf(open error!); exit(-1); if(write(fdr,buf_r,sizeof(buf_r)0) printf(write error); exit(-1); close(fdr);close(fd); return 0; #include #include #include #include #include #include #include #include /#define FIFO fifoint main() int fdw,fd; char buf100;memset(buf,0,sizeof(buf);fdw=open(fifo.txt,O_RDONLY);if(fdw0) printf(open error(W)!); exit(-1); /sleep(2); if(read(fdw,buf,100)0) printf(read error(W); exit(-1); printf(n%s,buf); close(fdw); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1