读卡器端,
#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);
}
另外,确保在运行代码之前已经实际创建了命名管道,其内容如下(from
bash
):mkfifo MyPipes
关于c - C中的命名管道示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21373655/