读者方,
#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);
}
问题是读者程序输出是垃圾值。
答案 0 :(得分:3)
你的(第一个)问题在于:
write (fd, ptr, strlen(ptr));
strlen
的{{1}} 不包含尾随的NUL字符。您需要使用"Akshit Soni"
作为长度。
您还应该允许strlen (ptr) + 1
可能不会返回您要求的所有字节(100),也不会返回所有已发送的字节(12包括NUL)。有可能(出于定时或中断等原因)只能通过read()
的一次调用读取数据的部分。
为了实现这一点,您可以尝试以下方式:
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);
}
):
bash
答案 1 :(得分:0)
确保以正确的顺序打开东西;首先打开管道进行写入,然后进行读取。你没有测试你对管道的开口没有NULL响应,你可能正在看垃圾。始终测试函数的返回值......
答案 2 :(得分:0)
创建命名管道是不正确的。 使用mkfifo创建它
对于创建文件,可能需要使用更多标志,假设已存在名为MyPipes的此类文件。 fd = open(“MyPipes”,O_WRONLY | O_CREAT); 没有O_CREAT,没有要创建的文件。
写(fd,ptr,strlen(ptr)); 改为 写(fd,ptr,strlen(ptr)+1);
strlen将使用“\ 0”返回长度。
答案 3 :(得分:0)
open
时无法添加正确的标记。
试试这个:
fd = open(“mypipe11”,O_WRONLY | O_CREAT);
修改强>
使用mkfifo打开之前在编写器中创建命名管道。
#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;
/* Create named pipe */
mkfifo("MyPipes", 0666);
/* open named pipe */
fd = open ("MyPipes",O_WRONLY);
write (fd, ptr, strlen(ptr));
close (fd);
}
@paxdiablo已经给出了创建命名管道的命令行方法。