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