我有一个写入fifo的bash脚本。我有一个C程序,可以从同一个fifo读取。
我确信该脚本有效,因为我试图用另一个脚本读取fifo并且一切正常。但有些东西在C程序中不起作用。当我运行我的脚本时,当我运行C程序时,它们就像是在等待彼此。这是代码。
脚本是(作者):
#!/bin/bash
fifo_name="myfifo";
# Se non esiste, crea la fifo;
[ -p $fifo_name ] || mkfifo $fifo_name;
echo "3" > $fifo_name;
echo "6" > $fifo_name;
这里是c程序(读者):
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_BUF 1024
int main(int argc, char *argv[])
{
int fd, i;
char * myfifo = argv[1];
char buf[MAX_BUF];
fd = open(myfifo, O_RDONLY);
while (1) {
if(read(fd, buf, MAX_BUF) > 0)
{
printf("Received: %s\n", buf);
}
}
close(fd);
return 0;
}
我哪里错了?
谢谢。
答案 0 :(得分:2)
如果您执行以下操作,它可以正常工作。
确保在运行C程序时,提供一个带有FIFO文件正确路径名的参数。
首先运行shell程序,因为如果它尚不存在,它将创建FIFO文件。
如果FIFO已经存在,可以通过让C程序退出来缓解第二个问题,例如:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_BUF 1024
int main(int argc, char *argv[])
{
int fd, i;
char * myfifo = argv[1];
char buf[MAX_BUF];
fd = open(myfifo, O_RDONLY);
if (fd == -1) {
perror("opening fifo");
return 1;
}
*buf = '0';
while (strchr (buf,'x') ==NULL) {
if((i = read(fd, buf, MAX_BUF)) > 0)
{
buf[i] = '\0';
printf("Received: [%s]\n", buf);
}
}
close(fd);
return 0;
}
你会注意到我还允许shell脚本在它通过x
发送时终止它,并且我还确保缓冲区被正确终止以便将其打印为字符串。
对shell脚本的(次要)更改是:
#!/bin/bash
fifo_name="myfifo";
# Se non esiste, crea la fifo;
[ -p $fifo_name ] || mkfifo $fifo_name;
echo "3" > $fifo_name;
echo "6" > $fifo_name;
echo "x" > $fifo_name;
我在C端看到的输出是:
Received: [3
]
Received: [6
x
]
你可以看到它并不总是你所期望的。 read
调用可能会在一次点击中获取多个发送,因为顶部没有真正的协议。如果你想避免这种情况,你需要添加自己的协议。