0

我有一个作为服务运行的程序,它从控制台获取标准输入,并将反馈打印到屏幕上。可以认为是下面这个简单的例子,而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

我希望服务接受“测试”,将其打印出来,然后等待下一个输入,但是,在第一次运行之后,它会无限地打印出“测试”,并且即使我删除了也不会再次响应管道文件它。

我做错了什么?

4

1 回答 1

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;
}

另外,请注意,命名管道与普通管道或控制台不同,其行为有所不同。

于 2012-12-30T21:07:57.843 回答