将字符串行写入C中的命名管道?

时间:2019-05-25 23:16:29

标签: c named-pipes c-strings fifo

我现在已经阅读了许多有关如何将数据传递到命名管道的示例和说明。但是我还是不明白。我有一些代码最终导致代表行的字符串(所以我需要换行吗?以\0终止还是之后?)。现在,我希望将每一行写到命名管道中,以供其他进程读取,cat将用于简化和测试。我对其他过程没有任何控制。我只需要将数据传递给它(如果有人想知道,则采用NMEA0183格式)。

char * createStr() {
    ... // do some stuff
    return strdup(str);
}

int main(int argc, char **argv) {
    FILE            *outstream;
    char            str[100];

    outstream=fopen("mypipe", "w");

    while (some condition) {
        str = createStr(); // creates my string
        str[strlen(str)-1] = '\n';
        fwrite(outstream, str, strlen(str)+1);
    }

    return 0;
}

或者,我尝试了这种方法:

while (my condition) {
    str = createStr(); // creates my string
    str[strlen(str)] = '\n';

    outstream=fopen("/var/run/gpspipe", "w");
    fputs(str, outstream);         
    fclose(outstream);
}

现在,当我通过cat mypipe同时读取管道时,会发生以下情况:

在这些示例的第一个示例中,直到缓冲区看似已满,我都不会从cat获得任何输出。也就是说,这将花费几秒钟的时间,并且不一定要写到最后一行。

另一方面,第二个示例始终将行放入命名管道中,但是cat有时只会找到1或2行并立即退出。

理想情况下,我希望这样: cat坐在那里等待新行,打印出来,然后继续坐在那里等待下一行。

这甚至可能吗?我是否可能需要线程(希望不要!)并在另一个线程中将管道保持打开状态?

0 个答案:

没有答案