我有一个作为服务运行的程序,它从控制台获取标准输入,并将反馈打印到屏幕上。它可以被认为是以下简单示例,而printf()
函数实际上是一些更复杂的函数。
//keyin.c
int main(int argc, char *argv[])
{
char buf[80];
int i = 1;
while(i++){
printf("enter %d string: \n", i);
scanf("%s", buf);
printf("print %d string: %s \n\n", i, buf);
sleep(2);
}
return 0;
}
现在我想使用命名管道作为输入,这样我就可以使用另一个程序通过写入管道将所需命令传递给服务,而不是在控制台中输入。
我通过以下方式创建了命名管道:
mknod MYFIFO p
然后我通过以下方式重定向输入:
root@ubuntu: ./keyin < MYFIFO
然后我将命令写入管道:
root@ubuntu: echo "test" > MYFIFO
我希望服务采取“测试”,打印出来,然后等待下一次输入,但是,在第一次运行后,它会无限制地打印出“测试”,并且永远不会再次响应管道文件,甚至当我删除它。
我做错了什么?
答案 0 :(得分:1)
您应该检查scanf()
的返回值。请注意,每次获得相同的重复缓冲区时,scanf()
都会返回负值。
int main(int argc, char *argv[]){
char buf[80];
int i = 1;
while(i++){
if(scanf("%s", buf) > 0){
printf("print %d string: %s \n\n", i, buf);
}
sleep(2);
}
return 0;
}
另请注意,命名管道与普通管道或控制台不同, 的行为方式不同。