fifos linux的问题

时间:2010-05-30 00:56:04

标签: c fifo

我在调试client.c中的read_from_fifo函数中的n_bytes与写入fifo的值不对应时遇到问题。它应该只写25个字节,但它尝试读取更多(确切地说是1836020505字节(!))。知道为什么会这样吗?

server.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#include <sys/stat.h>

typedef enum { false, true } bool;

//first read the int with the number of bytes the data will have
//then read that number of bytes
bool read_from_fifo(int fd, char* var)
{
    int n_bytes;
    if (read(fd, &n_bytes, sizeof(int)))
    {
        printf("going to read %d bytes\n", n_bytes);
        if (read(fd, var, n_bytes))
            printf("read var\n");
        else {
            printf("error in read var. errno: %d\n", errno);
            exit(-1);
        }
    }

    return true;
}

int main()
{
    mkfifo("/tmp/foo", 0660);
    int fd = open("/tmp/foo", O_RDONLY);
    char var[100];
    read_from_fifo(fd, var);
    printf("var: %s\n", var);
    return 0;
}

client.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

typedef enum { false, true } bool;

//first write to fd a int with the number of bytes that will be written afterwards
bool write_to_fifo(int fd, char* data)
{
    int n_bytes = (strlen(data)) * sizeof(char);
    printf("going to write %d bytes\n", n_bytes);
    if (write(fd, &n_bytes, sizeof(int) != -1))
        if (write(fd, data, n_bytes) != -1)
            return true;
    return false;
}


int main()
{
    int fd = open("/tmp/foo", O_WRONLY);
    char data[] = "some random string abcdef";
    write_to_fifo(fd, data);
    return 0;
}

非常感谢帮助。提前谢谢。

3 个答案:

答案 0 :(得分:0)

来自read(2)的错误的返回值是-1,而不是0.因此,对于第一个4字节读取的if语句至少是错误的。

答案 1 :(得分:0)

您是否验证了read_from_fifo()函数打印的nbytes是否显示正确的值? 只需注意写入(fd,data,n_bytes)时你没有写字符串char'\ 0'的结尾,每当你通过read(fd,var,n_bytes)读取它时,你没有添加'\ 0'到字符串刚刚读完,所以printf(“var:%s \ n”,var);可以显示不是\ 0结束的字符串,从而产生不可预测的结果。

答案 2 :(得分:0)

我自己找到了解决方案。

问题是')'信不信由你。 n_bytes变量是正确的,问题是我没有把它写到fifo。

(write(fd, &n_bytes, sizeof(int) != -1))

应该是(write(fd, &n_bytes, sizeof(int)) != -1)

无论如何,谢谢您的回答。