脚本bash写入一个fifo和c程序从中读取

时间:2014-09-18 09:30:11

标签: c bash pipe fifo writer

我有一个写入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;
}

我哪里错了?

谢谢。

1 个答案:

答案 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调用可能会在一次点击中获取多个发送,因为顶部没有真正的协议。如果你想避免这种情况,你需要添加自己的协议。