如何写入命名管道,不要等待读取管道

时间:2012-09-04 13:33:10

标签: c linux named-pipes

我正在写一个管道,直到用户输入字符串“end”。如果用户输入字符串“end”,我想更进一步。在这里我要关闭管道并打印消息“写入管道后”。但它没有打印“After Writed to Pipe”这一行甚至我输入了“end”字符串。如何关闭管道并进一步均匀 - 尽管没有进程来读取管道?..

嗨,这是我的代码。

int main() {
int fd;
char *b, *c;
printf("Enter Str : ");
b = malloc(50);
gets(b);

while(strcmp(b,"end")!=0){
    if(access("MSG",F_OK) != -1)    // check pipe is already available.
    {
        fd = open("MSG", O_WRONLY);
        write(fd, b, strlen(b) );
    }
    else
    {
        if( mkfifo("MSG", 0666) != -1)  // create pipe if not available.
        {
            fd = open("MSG", O_WRONLY);
            write(fd, b, strlen(b) );               
        }
    }
    printf("Enter Str : ");
    gets(b);
}   
close(fd);
printf("After Written to Pipe");

}

2 个答案:

答案 0 :(得分:1)

命名管道不是正确的工具,因为bash无法在非阻塞模式下使用它们。

可以用编程语言编写工具,其作用类似于cat,但不会阻止。但none of the results I found让我很高兴向你推荐它们。

否则它是套接字(使用netcatlocalhost),遗憾的是,这是不安全的,因为您计算机上的其他每个用户也都可以访问它们...

或某种充当缓冲区的普通文件。但是你有问题,如何删除你已经读过的行,这样就不会泛滥,竞争条件,以及所有那些噩梦。

对不起,但这里确实没有一个好的解决方案。要以正确的方式解决这个问题,需要修补bash和cat来添加一个允许非阻塞行为的选项。

答案 1 :(得分:0)

mkfifo(3)手册页:

  

但是,必须在两端同时打开它才能继续对其进行任何输入或输出操作。打开FIFO以便正常读取块,直到某个其他进程打开相同的FIFO进行写入,反之亦然。

以上段落意味着write将阻止,直到有人从FIFO中读取,这是您在程序中看到的。