首页 > 其他分享 >管道的学习

管道的学习

时间:2024-05-25 19:12:11浏览次数:13  
标签:write read 学习 管道 tm timerow include buf

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

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

int main()
{
    // 创建一个管道文件
    // int ret = mkfifo("./fifo1", 0644);
    // if (-1 == ret)
    // {
    //     printf("mkfifo fail\n");
    //     return -1;
    // }

    // 打开管道文件
    int pipe_fd = open("./fifo1", O_RDWR);
    if (-1 == pipe_fd)
    {
        printf("open pipe fail");
        return -1;
    }

    // 以只写的方式打开或创建文件"log.txt"
    FILE *file = fopen("./log.txt", "wb+");
    if (NULL == file)
    {
        perror("fopen file failed!\n");
        exit(1);
    }

    time_t timep;
    struct tm *timerow;

    // 创建一个读取缓存区
    char read_buf[128] = {0};
    char write_buf[128] = {0};

    // 创建一个进程
    int child_pid = fork();

    if (child_pid > 0) // 父进程
    {
		//向管道中读取相关信息
        int ret = read(pipe_fd, read_buf, sizeof(read_buf));
        wait(NULL);  //等待子进程结束
        printf("my is father,this is my write:%s\n",read_buf);
        
        if (ret != sizeof(read_buf))
        {
            printf("read fail\n");
        }
       //将读到的数据写入log.txt文本中
	   fwrite(read_buf, 1, sizeof(write_buf), file);
        
    }
    else if (child_pid == 0) // 子进程
    {
        // 获取当前时间戳
        timep = time(NULL);

        // 将时间戳的地址作为参数传递给函数localtime
        timerow = localtime(&timep);

        // 将数据输出到缓存区中
        sprintf(write_buf, "%d年%d月%d日,星期%d,%d:%d:%d",
                timerow->tm_year + 1900,
                timerow->tm_mon + 1,
                timerow->tm_mday,
                timerow->tm_wday,
                timerow->tm_hour,
                timerow->tm_min,
                timerow->tm_sec);

        write(pipe_fd, write_buf, sizeof(write_buf));
        printf("my is child,this is my write:%s\n",write_buf);
    }
    else //进程创建失败的情况
    {
        printf("fork fail\n");
        return -1;
    }

    return 0;
}

标签:write,read,学习,管道,tm,timerow,include,buf
From: https://www.cnblogs.com/Dazz24/p/18212883

相关文章

  • Java学习路线思维导图
    目录Java学习流程1.学习大纲2.Java开发中常用的DOS命令Java入门学习思维导图Java学习流程通过大纲了解学习的重点,通过目录依次深入【注:Java环境的搭建百度,提升自己百度的能力】1.学习大纲学习流程如下:Java基础语法Java的发展与特点(了解)Java语言规范(精......
  • MySQL入门学习.数据库组成.触发器
        触发器是一种特殊的存储过程,它在特定的表上定义,并在特定的事件(如插入、更新或删除操作)发生时自动触发执行。触发器可以用于实现数据的完整性约束、日志记录、数据同步等功能。以下是一个简单的示例,展示了如何创建一个在插入数据时自动触发的触发器:CREATETRIGGERm......
  • IceRPC之深入理解调度管道->快乐的RPC
    作者引言很高兴啊,我们来到了IceRPC之深入理解调度管道->快乐的RPC,为上篇的续篇,深入理解常见的调度类型,基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界。传入请求了解如何处理传入的请求接收传入的请求调度器的调度方法接受传入的请求。该传入请求是由连......
  • 今天学习总结
    iframe小案例:网站后台网站管理后台<divclass="container"><aside><ul><li><a系统配置href="../6.30/demo1.1.html"target="content">系统配置></a></li><li&g......
  • STM32F103C8T6独立看门狗学习笔记
    /*------------操作说明-------------------键寄存器IWDG_PR寄存器地址0x40003000初始值0X000000000X00005555解除对IWDG_PR、IWDG_RLR和IWDG_WINR寄存器的写入访问保护0X0000CCCC启动独立看门狗0X0000AAAA喂狗......
  • ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写
    2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在各行各业的应用呈现了更多的可能性。2023年11月7日......
  • 学习Java day01
    Java概述Java历史什么是程序?程序:程序是计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。Java重要特点1.Java是OPP。2.Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。3.Java语言是跨平台性的。一个编译好......
  • hsql学习笔记
    1. row_number()over(partitionbyuidorderbydt分析:row_number():这是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。默认情况下,这个序号是按照查询结果的顺序来分配的,但你可以通过OVER()子句中的ORDERBY来指定排序方式。OVER(PARTITIONBYuidORDERB......
  • C++基础知识学习笔记(5)——函数
    学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=95&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3函数函数的默认参数可以为形参提供默认值。intadd(inta,intb=1,intc=2){ returna+b+c;}intmain(){ cout<<(add(1,3,......
  • 学习javascript的数组
    1.什么是数组?数组:(Array)是一种数据类型,属于引用数据类型。作用:在单个变量名下存储多个数据2.声明语法let数组名=[数据1,数据2......];注意事项:数组是按照顺序保存(是有序的),所以,每一个数据都有自己的编号。编号从0开始,数据的编号经常称为索引或下标。数组可以存储任意......