管道的學習

Dazz_24發表於2024-05-25

在 /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;
    }
	//關閉管道以及log.txt文字
	close(pipe_fd);
	fclose(file);

    return 0;
}

相關文章