首页 > 其他分享 >管道文件的文件特性

管道文件的文件特性

时间:2024-05-26 09:04:59浏览次数:30  
标签:文件 写入 特性 管道 fd time 命名 include

目录

问题

在 /tmp 目录下创建一条命名管道,命名管道的名称用户决定,然后设计两个程序要求进程 A获取当前系统时间(time-->ctime)并写入到命名管道,进程B从命名管道中读取数据并存储在一个名字叫做 log.txt 的文本中。

进程A

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

int main() 
{
    char *fifo_path = "/tmp/myfifo"; // 命名管道路径
    int fd;
    time_t current_time;
    char *time_str;

    // 创建命名管道
    mkfifo(fifo_path, 0664);

    // 打开命名管道
    fd = open(fifo_path, O_WRONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 获取当前系统时间并转换为字符串
    current_time = time(NULL);
    time_str = ctime(&current_time);

    // 写入当前时间到命名管道
    write(fd, time_str, strlen(time_str) + 1);

    // 关闭命名管道
    close(fd);

    return 0;
}

进程B

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

#define max_buf 128

int main() 
{
    char *fifo_path = "/tmp/myfifo"; // 命名管道路径
    int fd;
    char buf [max_buf];

    // 打开命名管道
    fd = open(fifo_path, O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 从命名管道中读取数据
    read(fd, buf, max_buf);

    // 关闭命名管道
    close(fd);

    // 写入数据到 log.txt 文本文件
    FILE *fp = fopen("log.txt", "w+");
    if (fp == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    fprintf(fp, "%s", buf);
    fclose(fp);

    return 0;
}

结果

image

问题

如果进程A向命名管道中写入了数据之后就关闭了命名管道,而进程B从命名管道中读取了进程A写入的部分数据之后就关闭了命名管道,请问下次打开命名管道之后是否可以继续读取上一次遗留的数据?

答:不会,由上结果可知管道由内核申请的缓存区,在管道关闭后自动被清空,无法再读取上一次遗留数据。即使进程 A 向命名管道中写入了数据后关闭了管道,进程 B 也只能读取到进程 A 写入管道的部分数据,因为管道是一个先进先出的数据结构,进程 B 在关闭管道后,任何剩余的数据都会被丢弃。每次打开管道都是一个全新的读取过程,无法获取之前写入的数据。

标签:文件,写入,特性,管道,fd,time,命名,include
From: https://www.cnblogs.com/zhengdianshutiao-blogs/p/18213251

相关文章

  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • oracle导入dmp文件的2种方法
    博客园首页新随笔联系管理订阅随笔-6 文章-13 评论-4 阅读- 74764 oracle导入dmp文件的2种方法 使用imp、impdp方式导入数据1.使用imp导入数据打开cmd窗口,然后直接敲入一下命令即可,需要注意的是,要事先把dmp文件放到正确的路径中去impyx_base/11@......
  • react框架对Excel文件进行上传和导出
    1.首先需要安装xlsx第三方的库库引入插件npminstallxlsx在react引入import*asXLSXfrom'xlsx';1,首先设置jsx部分的 以下代码包含有导入excel文件和导出excel文件,读着可以根据需要,自己选择想要实现的功能 代码如下(示例)://importReactfrom'react';importR......
  • MySQL8.0新特性CTE表达式递归实现累加运算 1+2+…+n 等于多少?
    上一篇内容,通过MySQL存储过程实现累加运算1+2+…+n等于多少的需求,使用当前主流版本MySQL5.7.x和MySQL8.0.x,以及最新的MySQL8.4LST版本。WITHAS子句在MySQL8.0.x及更高版本中得到支持,而在MySQL5.7及以下版本中则不支持。参考地址如下:https://blog.csdn.net/zxrhhm/......
  • linux文件权限常用知识点,基于Linux(openEuler、CentOS8)
    目录知识点常用实例知识点真实环境文件显示解读常用实例文件所有者chown-Rnginx:nginx/home/source目录权限(R选填必须大写<遍历子文件夹及文件>)chmod-R755/home/sourcechmod-R777/home/source......
  • ES 6 新特性
    ECMAScript6(简称ES6)是JavaScript语言的标准,于2015年正式发布,带来了一系列显著的语言改进和新特性。以下是一些重要的ES6新特性:let和const:let关键字用于声明块级作用域的变量,解决了JavaScript中长期以来存在的变量提升和函数作用域问题。const关键字用于声明常量,一旦初始......
  • 使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法
    使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法一、编码问题例如我们需要从file.txt中读取文字,再使用outtextxy()函数向窗口绘制文字。查找EasyX的官方文档可知,该函数有两个重载,分别为:voidouttextxy(intx,inty,LPCTSTRstr)和voidouttextxy(intx,inty,TCHAR......
  • Ncast高清智能录播系统存在任意文件读取漏洞以及busiFacade RCE漏洞
    漏洞描述由于系统对用户输入的文件路径未进行充分验证,允许用户输入任意文件路径,导致存在任意文件读取漏洞,攻击者可以利用该漏洞获取系统配置文件、密码文件等。该系统的/classes/common/busiFacade.php接口存在RCE漏洞,攻击者可以利用此漏洞执行任意命令。fofaapp="Ncast-产品"......
  • Gradio存在任意文件读取漏洞(CVE-2024-1561)
    漏洞描述该漏洞是Gradio应用中的一个高危漏洞,其出现在'component_server'端点,允许攻击者调用'Component'类的任意方法,并利用'Block'类的'move_resource_to_block_cache()'方法在文件系统上复制任意文件到临时目录,随后可将其检索。这是的攻击者能够在未经授权的情况下读取本地文件......