为什么这段代码不会从管道中读取数据?

时间:2011-03-08 06:56:31

标签: c posix

我正在研究如何编写管道,并试图了解标准c库如何详细地公开它们。我编写了以下代码,并期望输出为

2 3
MAJOR ERROR
BYE

然而,第二行没有出现。有人可以解释为什么会这样吗?

int main()
{
    int rc;
    int p[2];
    char buffer[40];

    close(2);

    rc = pipe(p);
    printf("%d %d\n", p[0], p[1]);
    FILE* pipeWrite = fdopen(p[1], "w");
    fprintf(pipeWrite, "MAJOR ERROR\n");
    close(p[1]);

    rc = read(p[0], buffer, 40);
    buffer[rc] = '\0';
    printf("%s\n", buffer);
    printf("BYE\n");

    return 0;
}

感谢。

2 个答案:

答案 0 :(得分:3)

您正在使用标准IO缓冲操作(fprintf(3))写入管道,但在刷新输出之前关闭文件描述符。在fflush(pipeWrite);电话会议之前立即添加close(p[1]);,看看您的输出是否符合预期。 (您也可以使用fclose(pipeWrite);,因为关闭标准IO流也会刷新输出。)

有关标准IO流缓冲选项的更多详细信息,请参阅setvbuf(3)联机帮助页。

答案 1 :(得分:0)

  

int main(){       int rc;       int p [2];       char buffer [40];

close(2);

rc = pipe(p);
printf("%d %d\n", p[0], p[1]);
FILE* pipeWrite = fdopen(p[1], "w");
fprintf(pipeWrite, "MAJOR ERROR\n");
close(p[1]);

rc = read(p[0], buffer, 40);
buffer[rc] = '\0';
printf("%s\n", buffer);
printf("BYE\n");

return 0; }

#include <stdio.h>
#include <unistd.h>

int main()
{
    int rc;
    int p[2];
    char buffer[40];

    close(2);

    pipe(p);
    printf("%d %d\n", p[0], p[1]);
    /*    FILE* pipeWrite = fdopen(p[1], "w");
      fprintf(p[1], "MAJOR ERROR\n");*/
    if((rc = write(p[1], "MAJOR ERROR\n", 12)) > 0)
      printf("Wrote to pipe\n");
    close(p[1]);

    if((rc = read(p[0], buffer, 40)) > 0)
      {    buffer[rc] = '\0';
    printf("%s\n", buffer);
    printf("BYE\n");
      }

    return 0;
}

皮肤猫的许多方法之一