我正在写一个管道,直到用户输入字符串“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");
}
答案 0 :(得分:1)
命名管道不是正确的工具,因为bash
无法在非阻塞模式下使用它们。
你可以用编程语言编写工具,其作用类似于cat
,但不会阻止。但none of the results I found让我很高兴向你推荐它们。
否则它是套接字(使用netcat
和localhost
),遗憾的是,这是不安全的,因为您计算机上的其他每个用户也都可以访问它们...
或某种充当缓冲区的普通文件。但是你有问题,如何删除你已经读过的行,这样就不会泛滥,竞争条件,以及所有那些噩梦。
对不起,但这里确实没有一个好的解决方案。要以正确的方式解决这个问题,需要修补bash和cat来添加一个允许非阻塞行为的选项。
答案 1 :(得分:0)
从mkfifo(3)
手册页:
但是,必须在两端同时打开它才能继续对其进行任何输入或输出操作。打开FIFO以便正常读取块,直到某个其他进程打开相同的FIFO进行写入,反之亦然。
以上段落意味着write
将阻止,直到有人从FIFO中读取,这是您在程序中看到的。