使用命名管道将命令发送到正在运行的进程

时间:2012-12-30 20:09:42

标签: c named-pipes

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

我希望服务采取“测试”,打印出来,然后等待下一次输入,但是,在第一次运行后,它会无限制地打印出“测试”,并且永远不会再次响应管道文件,甚至当我删除它。

我做错了什么?

1 个答案:

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

另请注意,命名管道与普通管道或控制台不同, 的行为方式不同。