在 /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;
}