- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验三 进程间通信和信号灯
实验三 进程间通信和信号灯
班级: 姓名: 学号:
实验目的
理解Linux关于进程通信的概念。
掌握通过无名管道PIPE进行进程间通信的方法。
巩固进程同步概念和实现进程同步的方法。
加深对生产者消费者问题的理解。
学会使用Linux 信号量控制系统调用(PV操作)。
实验内容
编写一个程序,该程序主进程用来接受用户键盘输入的信息,子进程则将键盘输入的内容显示在屏幕上,该过程要求重复出现,直到用户使用ctrl+c终止程序运行。该实验内容其实质也是生产者消费者的问题,即一个进程产生数据(由用户输入),另一个进程输出之前由用户输入的数据。两个进程之间通过进程通信(IPC)技术来实现消息的传递,为了简化编码的复杂度,我们使用Linux中的管道技术(无名PIPE)实现进程间通信(有兴趣的同学,可以在完成后尝试使用共享内存的方式来进行进程间通信)。我们要求使用PV操作对信号量进行控制,从而实现生产者进程和消费者进程之间合理有序的工作(进程同步问题的进一步深入理解)。这里的PV操作,我们利用Linux系统提供的信号量系统调用来实现。
学习管道系统调用
所需头文件 :
#includeunistd.hint pipe(int filedes[2]); /*pipe()会建立管道,并将文件描述词由参数 filedes 数组返回。*/ filedes[0]为管道里的读取端,所以pipe用read调用的 filedes[1]则为管道的写入端。
ssize_t write(int fd, const void *buf, size_t count); /*像fd所指向的管道操作符(文件)写入数据*/
第一个参数表示所要写入数据的文件操作符,这里为管道操作符。
第二个参数表示所要写入信息所在的缓存区。
第三个参数表示缓冲区中前多少个数据应该被写入文件fd中。通常设定为缓冲区的大小。
例子: write(filedes[1], buf, sizeof(buf);
ssize_t read(int fd, const void *buf, size_t count); /*读取fd所指向的管道操作符的数据到缓冲区buf中*/
第一个参数表示所要读取数据的文件操作符,这里为管道操作符。
第二个参数表示读取的数据存放在哪里(注意数据类型)。
第三个参数表示读取读取多少个字符,一般为缓冲区的大小。
例子: read(filedes[0], buf, sizeof(buf));
请首先阅读???面程序,理解管道pipe如何使用,然后请输入该程序并编译运行,观察运行结果。我们希望子进程里的内容全部执行完毕,即先汇报自己是子进程和PID号,然后把信息写入管道,再报告信息写入完毕。然后父进程才开始执行,报告自己是父进程,并显示从子进程收到的信息,这时程序运行完毕。但由于进程推进的速度不可预知,所以该程序有问题。请思考如何利用信号灯控制(原语化),以达到预期的目的。(这里不要求重写此程序,因为后面的程序设计会涵盖该问题)
学习信号量控制函数:
所需头文件:
#include semaphore.h
#include fcntl.h
#include sys/stat.h
sem_t variable; /*定义一个信号量的指针*/
例子: sem_t *mutex;
sem_t* sem_open(const char *name, int oflag); /*用来创建一个POSIX信号量或打开一个已经存POSIX在的信号量,返回值为该信号灯的指针*/
第一个参数指明了型号量的外部名字,系统中的信号量是按信号量的名字进行识别的。
第二个参数指明了对第一个参数所指定的型号量进行什么样的操作,一般使用O_CREAT表示创建一个信号量,当使用O_CREAT时,要求使用额外的参数指定该信号量的权限(类似于open函数的参数)。
例子: mutex = sem_open(“mutex”, O_CREAT, 0644, 0);
其中0644为权限位;0表示信号量初始值,该值可在后续初始化函数中做修改。
sem_init(sem_t *sem, int pshared, unsigned int value); /*初始化信号量,在创建完信号量后使用*/
第一个参数为之前定义的信号量指针。
第二个参数表示该信号量是在线程间进行通信还是在进程间进行通信。当其值为0时,表示应用于线程间,当其值为1时,表示应用于进程间。
第三个参数为一个非负整形变量,代表信号量的初始值(可用资源量)。
例子: sem_init(mutex, 1, 1);
sem_wait(sem_t *se
文档评论(0)