尝试使用read()系统调用读取文件时程序卡住

明智的

这是我的代码段:

int fd;
bufsize = 30;
char buf[bufsize];
char cmd[100] = "file.txt";
int newfd = 1;

if (fd = open(cmd,O_RDONLY) >=0){
    puts("wanna read");
    while (read(fd,&bin_buf,bufsize)==1){
        puts("reading");
        write(newfd,&bin_buf,bufsize);
    }
    close(fd);
}

因此,这里的程序可以打印,"wanna read"但是从不打印"reading"我也尝试使用nonblock标志打开,但没有用。有谁能够帮我?只能使用open()read()系统调用。谢谢。编辑:我在代码中做了一些澄清。实际上,我要写入的newfd是一个套接字描述符,但是对于这个问题,我认为这并不重要,因为它粘在read之前的上write

chqrlie

您的read()呼叫尝试读取bufsize字节并返回实际读取的字节数。除非bufsize ==否则read()返回的可能性很小1,因此几乎总是跳过该块,并且不会写入任何内容。

还要注意,if (fd = open(cmd, O_RDONLY) >= 0)是不正确的,会集fd1,把手为标准输出,如果该文件存在,导致read失败的标准输入是最有可能的阅读没有打开。

请注意,read在某些环境下,使用系统调用进行读取非常棘手,因为返回值-1可能是可重新启动的。

这是一个改进的版本:

int catenate_file(const char *cmd, int newfd, size_t bufsize) {
    int fd;
    char buf[bufsize];

    if ((fd = open(cmd, O_RDONLY)) >= 0) {
        puts("wanna read");
        ssize_t nc;
        while ((nc = read(fd, buf, bufsize)) != 0) {
            if (nc < 0) {
                if (errno == EINTR)
                    continue;
                else
                    break;
            }
            printf("read %zd bytes\n", nc);
            write(newfd, buf, nc);
        }
        close(fd);
        return 0;
    }
    return -1;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章