命名管道C中的示例

时间:2014-01-27 05:31:26

标签: c output named-pipes

读者方,

#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);
}

问题是读者程序输出是垃圾值。

4 个答案:

答案 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)

  1. 创建命名管道是不正确的。 使用mkfifo创建它

  2. 对于创建文件,可能需要使用更多标志,假设已存在名为MyPipes的此类文件。 fd = open(“MyPipes”,O_WRONLY | O_CREAT); 没有O_CREAT,没有要创建的文件。

  3. 写(fd,ptr,strlen(ptr)); 改为 写(fd,ptr,strlen(ptr)+1);

  4. 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已经给出了创建命名管道的命令行方法。