终止标准输入链接到其他程序输出的 C 程序
Terminate C program which stdin is linked to output of other program
我有一个程序 x
,我想彻底终止它。
您可以通过简单地执行 ./x
并使用终端直接向 stdin
写入行并通过写入 exit
.
来终止它 运行
但是,如果您使用:cat file.txt | ./x
,stdin
现在是从文件中通过管道传输的,因此您永远不能键入 exit
。
结束此程序的最佳方式是在从文件中读取最后一行后自动终止。
或者,如果可能的话,我想重新路由 stdin
回到终端,以便像以前一样进一步允许手动输入。
下面是一些示例代码:
int main() {
// ...
while (ongoing) {
size_t n = 0;
char* ln = NULL;
getline(&ln, &n, stdin);
strtok(ln, "\n");
strtok(ln, "\r");
if (strcmp("exit", ln) == 0) {
break;
}
//...
}
}
当您从管道读取了所有输入后,EOF 将上升以指示已达到完整输入。
在您的示例中,这将大致等同于退出,因此您还可以检查 getline
的 return 值以查看 EOF 是否已达到(在这种情况下 -1 将是 return编辑).
您正在使用 getline 读取您的输入。 EOF 上的 getline returns -1。这很容易。
if (-1==getline(...))
break;
我有一个程序 x
,我想彻底终止它。
您可以通过简单地执行 ./x
并使用终端直接向 stdin
写入行并通过写入 exit
.
但是,如果您使用:cat file.txt | ./x
,stdin
现在是从文件中通过管道传输的,因此您永远不能键入 exit
。
结束此程序的最佳方式是在从文件中读取最后一行后自动终止。
或者,如果可能的话,我想重新路由 stdin
回到终端,以便像以前一样进一步允许手动输入。
下面是一些示例代码:
int main() {
// ...
while (ongoing) {
size_t n = 0;
char* ln = NULL;
getline(&ln, &n, stdin);
strtok(ln, "\n");
strtok(ln, "\r");
if (strcmp("exit", ln) == 0) {
break;
}
//...
}
}
当您从管道读取了所有输入后,EOF 将上升以指示已达到完整输入。
在您的示例中,这将大致等同于退出,因此您还可以检查 getline
的 return 值以查看 EOF 是否已达到(在这种情况下 -1 将是 return编辑).
您正在使用 getline 读取您的输入。 EOF 上的 getline returns -1。这很容易。
if (-1==getline(...))
break;