c - 将字符串通过管道传递给 scanf 会自动结束 C 中的系统 ("/bin/sh")

标签 c bash pipe

我很难找到一个好的标题,如果您有更好的想法,请随时编辑它!

我有这个程序:

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

int main(){
    char name[20];

    scanf("%24s",name);
    printf("name: %s\n",name);
    system("/bin/sh");

    return 0;
}

如果我启动它然后输入我的名字,它会工作得很好:

user@linux:~$ ./program 
J.Doe
name: J.Doe
$ 

如您所见,我得到了我的 shell。但是,如果我用管道传递我的名字,我将无法访问 shell:

user@linux:~$ echo "J.Doe" | ./program 
name: J.Doe
user@linux:~$

我的问题是,这里究竟发生了什么?为什么外壳是封闭的?我怎样才能通过管道传递一些命令,或者返回提示?

我想没有更多的数据要发送给程序(因为“J.Doe”已经发送给 scanf),但我相信 shell 会挂起,等待无限期。

最佳答案

当您向程序输入一行时,它仍会运行 shell,但该 shell 会用完输入并终止。它的标准输入设备是从程序继承而来的。

类似于:

notbinsh $ echo | /bin/sh
notbinsh $

/bin/sh 执行完空脚本并终止。

关于c - 将字符串通过管道传递给 scanf 会自动结束 C 中的系统 ("/bin/sh"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807288/

相关文章:

c - 包含 GPU 库的路径问题

c++ - 用于 C/C++ 开发的 Mac 与 Ubuntu?

git 别名清理/重置目录中的所有存储库

arrays - 如何在 Bash 中递增关联数组

c - 如何重新打开一个关闭的文件描述符

c - 通过管道传递 c 中的整个结构

c - 打算用Objective-C写操作系统

我可以为 C 项目重新生成一个具有正确链接顺序和依赖项的 makefile 吗?

linux - 为什么 "which cp | ls -l "不被视为 "ls -l $(which cp)"?

python - 在线程中使用 Popen 会阻塞每个传入的 Flask-SocketIO 请求