我正在研究如何编写管道,并试图了解标准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;
}
感谢。
答案 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;
}
皮肤猫的许多方法之一