我有一个文件输入:
$ cat input
1echo 12345
Run Code Online (Sandbox Code Playgroud)
我有以下程序
第一个版本
#include <stdio.h>
#include <stdlib.h>
int main() {
system("/bin/bash -i");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在如果我运行它,
$ gcc -o program program.c
$ ./program < input
bash: line 1: 1echo: command not found
$ exit
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作。
现在我想忽略文件输入的第一个字符,所以我getchar()
在调用system()
.
第二版:
#include <stdio.h>
#include <stdlib.h>
int main() {
getchar();
system("/bin/bash -i");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,bash 立即退出,就像没有输入一样。
$ gcc -o program program.c
$ ./program < input
$ exit
Run Code Online (Sandbox Code Playgroud)
问题为什么 bash 没有收到输入?
注意 我尝试了一些东西,我发现为主进程分叉一个新孩子可以解决问题:
第三版
#include …
Run Code Online (Sandbox Code Playgroud) 我正在执行一个带有 stdin 重定向的程序:
$ prog < f
Run Code Online (Sandbox Code Playgroud)
在这种情况下,标准输入被完全缓冲。
有没有技巧可以使它无缓冲或行缓冲?
编辑。
不修改程序源代码(即使用setvbuf())