linux实验报告 联系客服

发布时间 : 星期五 文章linux实验报告更新完毕开始阅读49185a84336c1eb91b375d34

(1) 使用vi命令编写程序pipe0.c: main() {

int fd[2];

char OutPipe[100],InPipe[100]; pipe(fd);

while((pid1=fork())== -1); if(pid1= =0) {

lockf(fd[1],1,0);

sprintf(OutPipe,“child 1 is sending message!”); /*把串放入数组outpipe中*/

write(fd[1],OutPipe,50); /*把串放入数组outpipe中*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else {

while((pid2=fork())== -1); if(pid2==0) {

lockf(fd[1],1,0); /*互斥*/ sprintf(OutPipe,“child 2 is sending message!”); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else {

wait(0); /*同步*/

read(fd[0],InPipe,50); /*从管道中读长为50字节的串*/ printf(“%s\\n”,InPipe); wait(0); } } }

(2)运行结果:

21

在显示结果时:

child 2 is sending message!(延迟5秒后显示) child 1 is sending message!(再延迟5秒) (3)分析原因:

本实验利用函数pipe()建立通信管道,两个子进程分别向管道写入信号,父进程读取管道信号在显示,管道的写入操作分别加锁实现互斥操作。子进程1先建立,所以第一次读取的管道信号是子进程发来的,等待子进程1终止后再从管道读取信号,此时的信号是子进程2发来的。由于管道通信的互斥、同步等通信机制,执行结果不会再出现随机性。 2.在父进程中用pipe()建立一条管道线,往管道里写一句话,两个子进程接收这句话。 (1) 使用vi命令编写程序pipe1.c: main() {

int fd[2];

char OutPipe[100],InPipe[100]; pipe(fd);

while((pid1=fork())==-1); if(pid1==0)

{ sleep(2);

lockf(fd[0],1,0); read(fd[0],InPipe,50);

printf(\ printf(\

lockf(fd[0],0,0); exit(0); } else {

while((pid2=fork())==-1); if(pid2==0 ) { sleep(2); lockf(fd[0],1,0); read(fd[0],InPipe,50);

printf(\ printf(\

22

lockf(fd[0],0,0); exit(0); } else {

lockf(fd[1],1,0);

sprintf(OutPipe,\ write(fd[1],OutPipe,50); lockf(fd[1],0,0); sleep(5); wait(); sleep(5);

wait(); exit(0); } } }

(2)运行结果:

(3)分析原因:

本实验利用函数pipe()在父进程中建立通信管道,两个子进程分别接收来自父进程的写入信号。子进程1先建立,所以第一次读取的管道信号是子进程发来的,等待子进程1终止后再从管道读取信号,此时的信号是子进程2发来的。

二、流程图

开始 初始化变量 创建子进程pid1 否 子进程pid1创建是否成功? 是 当前是父进程? 否 创建子进程pid2 否 23 子进程pid2创建是否成功? 是 写入管道打印

三、实验总结

本次实验在编写程序pipe.c时,利用函数pipe()建立通信管道,两个子进程分别向管道写入信号,父进程读取管道信号在终端显示。在编写程序pipe1.c时,利用函数pipe()在父进程中建立通信管道,两个子进程分别接收来自父进程的写入信号。按照实验要求,发现两次的调试结果居然一样。我总结出此次实验主要是利用函数pipe()建立通信管道,子进程或父进程从通信管道读取信号然后在终端显示出来。

(四)消息的发送与接收实验

【实验目的】

1.了解什么是消息。 2.熟悉消息传送机理。 3.编程实现消息的发送与接收。

【实验内容】

一、消息的发送与接收

1.消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。 (1) 使用vi命令编写程序client.c和server.c: ①client.c

void client()

24