C语言 为什么系统调用“read()”会阻塞我的程序?

lqfhib0f  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(276)

我联系你是因为我的程序有问题。为了我的学习,我目前正在用C编写一个函数来读取文件,我只被允许使用以下函数/系统调用:* * malloc、释放、退出、(f)打开、(f)关闭、(f)读取、(f)写入、获取行、ioctl、usleep、sigaction、信号、状态、lstat、fstat**
问题是,当调用我的函数my_filetostr()时,它在read()系统调用处阻塞了程序,什么也没发生。
下面是我代码:

char *my_filetostr(const char *filepath)
{
    int fd = 0;
    struct stat s;
    char *buff = NULL;
    if (fd = open(filepath, O_RDONLY) > 0) {
        stat(filepath, &s);
        buff = malloc(sizeof(char) * s.st_size + 1);
        my_printf("fd : %d, size : %d\n", fd, s.st_size);
        if (read(fd, buff, s.st_size) == s.st_size) {
            buff[s.st_size] = '\0';
        }
        close(fd);
    }
    return buff;
}

我指定我的文件存在(我的错误处理工作)。
我试着放一些my_printf(我们不得不重新编码printf)来查看程序停止的位置并显示一些有用的信息:

  • 所以我知道问题出在read()
  • st_size返回正确的大小,并且filedescriptor具有正确的值。

这个项目应该继续下去。

xxe27gdn

xxe27gdn1#

您在if条件内为fd赋值。
这通常会导致错误和should be avoided
这里的问题是因为>=相比具有higher precedence,所以fd变为1,即标准输出。
我已经修改了您的代码以突出显示https://godbolt.org/z/M4PbcPfev问题
fd:1,尺寸:140728905723182

plicqrtu

plicqrtu2#

感谢您@斯塔克,@用户3840170,@特哈斯
我的代码现在可以工作了:

char *my_filetostr(const char *filepath)
{
    int fd = -1;
    struct stat s;
    char *buff = NULL;
    if ((fd = open(filepath, O_RDONLY)) != -1) {
        fstat(fd, &s);
        buff = malloc(sizeof(char) * s.st_size + 1);
        if (read(fd, buff, s.st_size) == s.st_size) {
            buff[s.st_size] = '\0';
        }
        close(fd);
    }
    return buff;
}

我已执行以下操作:

  • 将stat替换为fstat(但这并没有解决问题)
  • int fd = 0替换为int fd = -1
  • 更换fd = open(filepath, O_RDONLY) > 0部件(fd = open(filepath, O_RDONLY)) != -1

谢谢你的回答。

相关问题