linux - 执行后,管道缓冲区中的内容消失

标签 linux pipe execv

有两个进程,父进程和子进程 父进程标准输入中有一些数据。内容是:

the 1 line
the 2 line
the 3 line
the 4 line

父进程代码:

//parent
fgets(buffer, 1000, stdin);
printf("I have data:%s", buffer);   //print "I have data:the 1 line" 
if(!fork())
{
    fgets(buffer, 1000, stdin);
    printf("I have data:%s", buffer);   //print "I have data:the 2 line"
    execv("child", NULL);          
}
else
{
    exit(0);
}

子进程代码:

//child
main()
{
    fgets(buffer, 1000, stdin);  //blocked if parent stdin content size<4096
    printf("I have no data:%s", buffer);  
}

为什么? 子进程是否可以读取标准输入中的第三行?

最佳答案

fgets 是一个 stdio 函数,因此它使用位于进程地址空间中的 stdio 缓冲区。当您执行时,该缓冲区与原始程序的其余部分一起消失,并且执行的程序分配它自己的 stdio 缓冲区。

如果您的文件是可搜索的,那么在 exec 之前 fseek 相对于 SEEK_CUR 定位 0 可能会有所帮助(它可以将底层 fd 重新定位到正确的点以继续阅读从 stdio 停止的地方)。

关于linux - 执行后,管道缓冲区中的内容消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118208/

相关文章:

c - 通过管道在 C 中进行实时流 gpg 加密

linux - 如何判断 Unix 管道中的下游进程是否已崩溃

C 程序不从等待语句返回

linux - 如何执行进程,在缺少基于文件系统的功能的情况下保留功能?

linux - 这个复杂的 shell 命令(包含 |、&& 和 sed)是如何工作的?

go - 关闭加密 ssh session 以释放 golang 中所有资源的正确方法?

c - 使用 execv() 时没有这样的文件或目录

c++ - 从 C++ 执行命令,argv[0] 中预期的是什么?

linux - 查找哪个进程被 Linux OOM killer 杀死

linux - UNIX 和 Linux 中的 ls -ltr 命令 - 行为