【问题标题】:read() write() into pipe() via dup2() with stdin and stdout使用标准输入和标准输出通过 dup2() 将 read() write() 写入 pipe()
【发布时间】:2026-01-14 03:15:01
【问题描述】:

我需要模拟Linux命令“cal -3”,并排显示3个月的日历。我现在需要的是让我的实现,使用管道,工作。我被告知我不能使用fork(),而是应该使用dup2()write()read()close() 来调用system("myCustomCommand") 三次。现在我的程序没有并排显示日历。

我正在尝试使用管道并遇到了问题。这是我正在尝试的:

int pfd[2];
int p; //for pipe
int d; //for dup2
const int BSIZE = 256;
char buf[BSIZE];

p = pipe(pfd);
if (p == -1) { perror("pipe"); exit(EXIT_FAILURE); }
if (p == 0)
{
    d = dup2(pfd[1], 0);
    close(pfd[1]);
    nbytes = read (pfd[1], buf , BSIZE);
    close(pfd[0]);
    exit(EXIT_SUCCESS);
}
else
{
    close(pfd[0]);
    write(pfd[1], "test\n", BSIZE);
    close(pfd[1]);
    exit(EXIT_SUCCESS);
}

不幸的是,这段代码没有显示任何内容。你能帮我解决这个问题吗?

【问题讨论】:

    标签: c linux command-line pipe


    【解决方案1】:

    这看起来像家庭作业,所以我会给你一个解决问题的方法:

    1. 让它与一个日历一起工作,一次读取一行并写入标准输出。
    2. 现在将每一行存储在一个字符串数组中,并在读入整个日历后打印出每一行。
    3. 让它与三个日历一起工作,将每个日历的结果存储到三个单独的字符串数组中,然后打印出所有三个(不是彼此相邻)。
    4. 不是打印出一个日历中的所有行,然后打印下一个日历中的所有行,等等,而是打印出每个日历的第一行,然后是每个日历的第二行,等等。
    5. 调整格式直到看起来正确为止。

    【讨论】:

      【解决方案2】:

      一次显示三个日历与分叉进程无关,实际上您不需要进入管道和其他东西。

      您想要使用ncurses 库来对您的输出进行特殊控制。

      【讨论】:

      • 我的要求之一是使用 pipe() 和 dup2()。使用 read()/write() 到标准输入/标准输出
      【解决方案3】:

      为什么不使用 FILE *fp = popen("my command", "r"); ,将输出读入字符串数组,重复 3 次并正确连接数组?

      【讨论】:

        最近更新 更多