我有一小段简单易懂的代码:
#include <stdio.h>
#include <unistd.h>
int main(){
char buff[0x10];
read(STDIN_FILENO, buff, 0x10);
int result = write(STDIN_FILENO, buff, 0x10);
printf("\n%d\n", result);
return 0;
}
我编写了这个小程序来查看通过键盘输入和通过文件重定向输入之间的区别。当我输入内容abcdefgh12345678
然后按 Enter 键时,程序给出了结果:
abcdefgh12345678
abcdefgh12345678
16
但后来我创建了一个名为的文件input
,其中包含abcdefgh12345678
然后将其作为输入提供给我们的程序,./program < input
程序的结果是:
-1
我调试后发现错误代码为 9,这意味着 STDIN 正忙,因为它已被打开以供读取buff
。
write()
我的问题是:我该怎么做,或者有什么解决方法可以不通过键盘输入而向程序提供输入,以便在调用函数时不会引发错误?
答案1
write(STDIN_FILENO, ...)
当 未连接到终端时将返回 -1 STDIN_FILENO
,例如当它来自 中的管道时
./main < input
。您可以使用isatty(3)
来检查 stdin 是否连接到终端。附注:检查write()
程序中的返回代码并通过打印相应的 errno 消息让用户知道事情出错了并且只写入 读取的字符数是一种很好的做法read()
。您的程序可能如下所示:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
int main(void){
char buff[0x10];
size_t count = read(STDIN_FILENO, buff, 0x10);
printf("isatty(STDIN_FILENO): %d\n", isatty(STDIN_FILENO));
int result = write(STDIN_FILENO, buff, count);
if (result == -1)
{
perror("write");
return EXIT_FAILURE;
}
printf("\nresult: %d\n", result);
return 0;
}
结果:
$ ./main
abcdefgh12345678
isatty(STDIN_FILENO): 1
abcdefgh12345678
result: 16
$ ./main < input
isatty(STDIN_FILENO): 0
write: Bad file descriptor