gpt4 book ai didi

c - linux 的 fifos 问题

转载 作者:行者123 更新时间:2023-11-30 18:08:59 25 4
gpt4 key购买 nike

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

服务器.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;
}

客户端.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;
}

非常感谢您的帮助。提前致谢。

最佳答案

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

关于c - linux 的 fifos 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com