读卡器端,

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
        int fd;
        char buff[100];
        fd = open ("MyPipes",O_RDONLY);
        read (fd, buff, 100);
        printf ("%s\n",buff);
        close(fd);
}

作者方面,
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

char *ptr = "Akshit Soni";
int main()
{
        int fd;
        fd = open ("MyPipes",O_WRONLY);
        write (fd, ptr, strlen(ptr));
        close (fd);
}

问题是读取器程序输出获取垃圾值。

最佳答案

你(第一)的问题在于:

write (fd, ptr, strlen(ptr));

strlen"Akshit Soni"不包括尾随的NUL字符。您需要使用strlen (ptr) + 1作为长度。
您还应该考虑到read()可能不会返回您要求的所有字节(100)或发送的所有字节(12包括NUL)。有可能(由于时间或中断等原因),一次调用read()只能读取部分数据。
考虑到这一点,您可以尝试以下方法:
int main()
{
    int fd;
    char buff[100];
    fd = open ("MyPipes",O_RDONLY);
    int sz = read (fd, buff, 100);
    while ((sz > 0) && (buff[sz-1] != '\0')) {
        printf ("%*.*s", sz-1, sz-1, buff);
        sz = read (fd, buff, 100);
    }
    if (sz > 0)
        printf ("%s\n",buff);
    close(fd);
}

另外,确保在运行代码之前已经实际创建了命名管道,其内容如下(frombash):
mkfifo MyPipes

关于c - C中的命名管道示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21373655/

10-13 06:18