操作系统实验-基于管道的进程间数据传输

news/2024/11/7 21:39:52/

一、实验目的:

(1)熟悉Linux下的应用程序开发

(2)熟悉Linux的进程控制原语的使用

(3)掌握Linux操作系统的进程间通信机制管道的使用。

(4)掌握Linux操作系统中父进程与子进程的同步。

二、实验原理:

(1)进程创建函数pid_t fork(void)。返回值:fork函数被正确调用后,将会返回两次!!(通过返回值,可以确定是在父进程中返回还是子进程中返回)

在子进程中返回其返回值为0(不合法的PID,因为PID=0的进程是交换进程);在父进程中返回其返回值为子进程ID(可以让父进程知道所创建的子进程ID号)

;出错返回-1。

  1. 管道创建函数int pipe(int fildes[2]);pipe函数创建一个通信缓冲区,程序可以通过文件描述符fildes[0]和fildes[1]来访问这个缓冲区:filedes[0]为读而打开,filedes[1]为写而打开;写入fildes[1]的数据可以按照先进先出的顺序从fildes[0]中读出。

(3)读管道函数ssize_t  read( int filedes,  void *buf, size_t  nbytes);第一个参数为管道读文件描述符(pipe函数获取的fildes[0]);第二个参数为读缓冲区的指针,第三个参数为希望读取的字节数。read函数从打开的管道文件中读数据。如成功,则返回实际读到的字节数,如已到达管道文件的末尾或无数据可读,则返回0。

(4)写管道函数ssize_t  write( int filedes,  const void *buf, size_t  nbytes);第一个参数为管道写文件描述符(pipe函数获取的fildes[1] );第二个参数为写缓冲区的指针,第三个参数为希望写入的字节数。该函数返回实际写的字节数,通常与参数nbytes的值相同,否则表示出错。

(5)关闭管道函数int  close( int  filedes );该函数关闭管道的读文件和写文件,参数为读文件和写文件的文件描述符;进程关闭管道读/写文件后,就不能再通过该文件描述符读/写管道。

(6)进程间同步控制。可以利用pid_t waitpid(pid_t pid,int *status,int options)函数实现进程间的同步控制。参数pid:一个进程ID:pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。 pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。参数status:子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数options:options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用“|”运算符把它们连接起来使用。不需要时可以传入0。

三、实验内容:

(1)父进程首先使用系统调用pipe()建立一个管道,然后使用系统调用fork() 创建子进程1:子进程1关闭管道读文件;子进程1通过文件I/O操作向管道写文件写一句话(向文件中写入字符串):Child process 1 is sending a message! ;然后子进程1调用exit()结束运行。

(2)父进程再次使用系统调用fork() 创建子进程2:子进程2关闭管道读文件;子进程2通过文件I/O操作向管道写文件写一句话(向文件中写入字符串):Child process 2 is sending a message! ;然后子进程2调用exit()结束运行。

(3)父进程关闭管道写文件,父进程通过文件I/O操作从管道读文件中读出来自于两个子进程的信息,通过printf语句打印输出在屏幕上.

参考代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#define BUFF_SIZE 2
int main(){char *bufout[BUFF_SIZE] = {"Child process 1 is sending a message!","Child process 2 is sending a message!"}; // 写入消息缓冲区char *bufin[BUFF_SIZE]; // 读取消息缓冲区int fd[2]; //管道文件描述符pid_t childpid1,childpid2; // 子进程pidint s1_len,s2_len;if(pipe(fd) == -1){ // 创建管道失败printf("Failed to create pip!!!");exit(1);}childpid1 = fork(); // 创建子进程1if(childpid1 == -1){printf("Failed to fork!!!");exit(1);}if(childpid1 == 0){ //子进程close(fd[0]); // 关闭管道读文件s1_len = strlen(bufout[0]);write(fd[1],bufout[0],s1_len); // 写入信息exit(0);} else { // 父进程waitpid(childpid1,NULL,0);}childpid2 = fork();// 创建子进程2if(childpid2 == -1){printf("Failed to fork!!!");exit(1);}if(childpid2 == 0){ //子进程close(fd[0]); // 关闭管道读文件s2_len = strlen(bufout[1]);write(fd[1],bufout[1],s2_len); // 写入信息exit(0);} else{ // 父进程waitpid(childpid2,NULL,0);}close(fd[1]); // 关闭通道写文件read(fd[0],bufin[0],s1_len);read(fd[0],bufin[1],s2_len);printf("父进程从管道读取子进程1写入的消息为:%s\n",bufout[0]);printf("父进程从管道读取子进程2写入的消息为:%s\n",bufout[1]);return 1;
}


http://www.ppmy.cn/news/506257.html

相关文章

JZ4 二维数组中的查找(牛客Java,三种方法)

题目链接:二维数组中的查找_牛客题霸_牛客网 描述 在一个二维数组array中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数…

免费代理IP网站

免费代理IP网站 西刺免费代理&#xff1a;http://www.xicidaili.com/ 米扑代理&#xff1a;http://proxy.mimvp.com/free.php?proxyin_hp http://www.66ip.cn/ http://www.goubanjia.com 这个是githup上一个开源的免费代理池&#xff1a;https://github.com/WYL-BruceLong…

python代理IP的使用

python代理IP的使用 # 代理ip """ 客户端和服务器之间通过网络进行通信。为什么客户端能够正确的找到服务器、服务器也能够 正确的找到客户端&#xff0c;涉及到网络中的IP地址。在同一个网络下IP地址是唯一的。 """""" 代理ip等…

在线代理 网页代理 ip代理 在线代理ip 代理ip 网页代理ip ip在线代理

在线代理 网页代理 ip代理 在线代理ip 代理ip 网页代理ip ip在线代理 在线代理 网页代理 ip代理 在线代理ip 代理ip 网页代理ip ip在线代理 posted on 2014-03-04 15:44 lexus 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/lexus/p/3580511.html

2023-5-8分享免费代理ip

实时更新代理IP:http://www.857ip.cn:8081 182.139.110.529000高匿名HTTP四川省成都市 电信0.6秒2023-05-08 16:31:01182.139.110.2079000高匿名HTTP四川省成都市 电信4秒2023-05-08 15:31:01222.74.73.20242055高匿名HTTP内蒙古自治区赤峰市 电信1秒2023-05-08 14:31:0127.42…

Socks5代理和IP代理

Socks5代理和IP代理是常用的网络代理服务&#xff0c;它们为用户提供了匿名访问和保护隐私的功能。在本文中&#xff0c;我们将介绍这两种代理的基本概念和工作原理&#xff0c;并展示如何编写一个简单的代理服务器。 一、什么是Socks5代理和IP代理&#xff1f; Socks5代理…

IP切换代理 免费资源共享

IP代理免费资源共享 闪臣代理 标题兑换网址&#xff1a;https://shanchendaili.com/ 在充值页面点击兑换验证码复制输入就可以啦~ 日付兑换码 RT80c0ea0f7d00A9C883529a RTe5a1a66e33DFF08CE4BAe7 RT84b92c1cc86A53CCE36710 RT184275d937519897881565 RT06863335834B7834DD34…

记一次内网环境正向代理极光推送

背景 公司正式服务器都是局域网环境&#xff0c;通过一台有外网的服务器作跳板机&#xff0c;使用nginx反向代理来访问服务。 这样一来&#xff0c;局域网内的服务就无法访问外网&#xff0c;导致下图报错。 解决问题 当时从csdn上找到了解决方案&#xff0c;由于第一次写博…