- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验七 管道通信1
实验7 管道通信
实验目的
(1)加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;
(2)了解并熟悉Linux系统中利用管道实现进程通信的基本概念及方法;
(3)熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数。
实验准备及预习
阅读讲义《附件8-管道通信》,了解Linux系统中利用管道实现进程通信的基本概念及方法,熟悉Linux提供的有关系统调用函数/库函数:pipe()、mkfifo、close()、read()、write()、lockf()。
实验内容
1、管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourneshell或C shell等)键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行,执行并理解命令的含义:
$kill -l显示了当前系统支持的所有信号
$kill -l | grep SIGRTMIN
2、函数int pipe(int fd[2])创建一个???道,管道两端可分别用描述字fd[0]以及fd[1]来描述。需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。下面给出的程序使用系统调用pipe()建立一条管道线,两个子进程p1和p2分别向管道各写一句话:child1 is sending a message!和child2 is sending a message!,父进程则从管道中读出来自子进程的信息,并显示在屏幕上。请读懂程序并调试运行。
#include unistd.h
#include stdio.h
main()
{ int fd[2];
int pid1,pid2;
char OutPipe[100], InPipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0){
printf(“child process1 %d\n”,getpid());
lockf(fd[1],1,0); /*加锁锁定写入端*/
sprintf(OutPipe, “child1 is sending a message!”);
write(fd[1], OutPipe, 50); /*将buf中的50个字符写入管道*/
sleep(5); /*睡眠5秒,暂时放弃CPU*/
lockf(fd[1],0,0); /*解锁释放写入端*/
exit(0); /*结束进程pid1 */
}else{
while((pid2=fork())==-1);
if(pid2==0){
printf(“child process2 %d\n”,getpid()”);
lockf(fd[1],1,0);
sprintf(OutPipe, “child2 is sending a message!”);
write(fd[1], OutPipe, 50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}else{
printf(“parent process %d\n”,getpid());
wait(0);
read(fd[0],InPipe,50);
printf(“%s\n”,InPipe);
wait(0);
read(fd[0],InPipe,50);
printf(“%s\n”,InPipe);
exit(0);
}
}
}
3、使用管道通信时,可关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用read和write像操作文件一样去操作它。下面给出的程序中子进程通过管道向父进程发送数据,这里子进程只使用到管道的写端口fd[1]、父进程使用到了fd[0],因此可关闭子进程的fd[0]和父进程的fd[1]。请通过程序体会。
#includesys/types.h?
#includeunistd.h?
#includestdio.h?
#includestdlib.h?
#includeerrno.h?
#includememory.h??
int?main()?
{?
??char?*msg=I?am?child?process!;? /*子进程发送的数据*/?
??pid_t?pid;??
??char?buf[100]; /*用于读取*/?
??int?pi; /*创建管道时的返回值*/?
??int?fd[2]; /*创建管道的参数*/
文档评论(0)