gpt4 book ai didi

c - 刷新管道的缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:03 26 4
gpt4 key购买 nike

我在玩管道,从 here 中获取了以下代码;一旦我明白我遇到了 block 缓冲问题,我就添加了对原始代码中不存在的 sleep() 的调用:

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

int main ()
{
FILE *ps_pipe;
FILE *grep_pipe;

int bytes_read;
int nbytes = 100;
char *my_string;

char buffer[100];

/* Open our two pipes */
ps_pipe = popen ("ls", "r");
grep_pipe = popen ("sort", "w");

/* Check that pipes are non-null, therefore open */
if ((!ps_pipe) || (!grep_pipe))
{
fprintf (stderr,
"One or both pipes failed.\n");
return EXIT_FAILURE;
}

bytes_read = 0;
while (fgets(buffer, sizeof(buffer), ps_pipe))
{
fprintf(grep_pipe, "%s", buffer);
bytes_read += strlen(buffer);
}

printf("Total bytes read = %d\n", bytes_read);
sleep(2);

/* Close ps_pipe, checking for errors */
if (pclose(ps_pipe) != 0)
{
fprintf(stderr, "Could not run 'ps', or other error.\n");
}

/* Close grep_pipe, cehcking for errors */
if (pclose(grep_pipe) != 0)
{
fprintf(stderr, "Could not run 'grep', or other error.\n");
} /* Exit! */

return 0;
}

编辑[这是错误的,见下面的答案]:这样,我确保一旦程序从其主要功能返回,管道的缓冲区就被刷新。

但是,我仍然不明白原因:为什么管道的内核缓冲区会被刷新到标准输出?前者与后者有什么关系? [编辑:这也是错误的,但留给上下文]

最佳答案

sleep 对任何内核缓冲区都没有影响。

您在 stdout 上看到的输出来自 sort 进程,并通过关闭 grep_pipe 触发。

您的程序实际上是在模拟以下 shell 脚本:

ls | sort

你打开一个管道从 ls 中读取,使用它的所有输出(从它的 stdout)并将这个输出发送到 stdin 排序 过程。 sort 无法对行进行排序,直到它拥有所有行,并且只有在其 stdin 关闭时它才知道它拥有所有行,这发生在您关闭时grep_pipe

一旦 grep_pipe 关闭,sort 开始工作,将排序后的行生成到它的 stdoutpclose 直到相关进程终止才会返回,此时 sort 将完成其所有输出的生成。

关于c - 刷新管道的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com