3

我正在写入管道,直到用户输入字符串“end”。如果用户输入字符串“end”,我想更进一步。在这里,我必须关闭管道并打印消息“写入管道后”。但即使我输入了“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");

}
4

2 回答 2

1

mkfifo(3)手册页:

但是,它必须同时在两端打开,然后才能继续对其进行任何输入或输出操作。打开一个 FIFO 进行读取通常会阻塞,直到某个其他进程打开同一个 FIFO 进行写入,反之亦然。

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

于 2012-09-04T13:43:23.900 回答
1

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

可以用一种编程语言编写一个工具,它的行为类似于cat,但不会阻塞。但我发现的任何结果都没有让我很高兴向你推荐它们。

否则它是套接字(使用netcatand localhost),不幸的是,它是不安全的,因为您计算机上的每个其他用户也可以访问它们......</p>

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

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

于 2013-11-22T13:12:56.013 回答