【问题标题】:Using open(), read() and write() system calls to copy a file使用 open()、read() 和 write() 系统调用来复制文件
【发布时间】:2017-11-19 01:22:01
【问题描述】:

我在使用read()write()open() 将文件复制到新目录时遇到问题。我可以使用open() 创建一个新文件,并且可以使用write() 写入终端,但我假设如果我将int 文件描述符从打开传递到写入,写入将写入指定文件。

除此之外,一旦我打开一个文件,权限都是很时髦的,我只能以 root 身份打开它。每次创建文件时,它都是空的,但我可以看到我刚刚读取的整个文件都打印在终端中。

我已经阅读了每个系统调用的 man 文件,但我仍然不明白这里的问题是什么。

这是我的代码:

void *scanFile( s_request *request )
{
    //TODO Print out all struct variables.
    pthread_mutex_lock(&mutex);

    int readFileReference;
    int writeFileReference;
    int bufferSize = request->bufferSize;
    int numberOfBytesRead = bufferSize;
    int *buffer[bufferSize];

    if ((readFileReference = open(request->file, O_RDONLY)) == -1)
    {
        printf("Failed to open file. Aborting.\n");
        exit(EXIT_FAILURE);
    }

    if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1))
    {
        printf("Failed to open write file. Aborting.\n");
        exit(EXIT_FAILURE);
    }

    while ((read(readFileReference, buffer, numberOfBytesRead)) != 0)
    {
        write(writeFileReference, buffer, bufferSize);
        bzero(buffer, bufferSize);
    }

    pthread_mutex_unlock(&mutex);
}

修复了问题:

更新代码:

void *scanFile( s_request *request )
{
    //TODO Print out all struct variables.
    pthread_mutex_lock(&mutex);

    int readFileReference;
    int writeFileReference;
    int bufferSize = request->bufferSize;
    int numberOfBytesRead = bufferSize;
    int *buffer[bufferSize];

    if ((readFileReference = open(request->file, O_RDONLY)) == -1)
    {
        printf("Failed to open file. Aborting.\n");
        exit(EXIT_FAILURE);
    }

    if ((writeFileReference = open("newfile.txt", O_CREAT | O_WRONLY, 0777)) == -1)
    {
        printf("Failed to open write file. Aborting.\n");
        exit(EXIT_FAILURE);
    }

    while ((read(readFileReference, buffer, numberOfBytesRead)) != 0)
    {
        write(writeFileReference, buffer, bufferSize);
        bzero(buffer, bufferSize);
    }

    close(writeFileReference);
    close(readFileReference);

    pthread_mutex_unlock(&mutex);
}

【问题讨论】:

  • 您未能阅读open 的文档。创建文件时需要三个参数。
  • 你说得对。谢谢@ZanLynx

标签: c pthreads


【解决方案1】:
if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1))

这一行的括号有误。 (在readFileReference 行上是正确的。)你想要的是:

if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR)) == -1)
                                                                         ^^^    ^^^

该行的原始版本调用open(),与-1 进行比较,然后将比较结果分配给writeFileReference

另外:

  • 正如 Zan Lynx 在评论中所指出的,您需要在创建文件时将权限值传递给 open()0666 通常是正确的——它将文件创建为可读/可写。 (它被进程umask修改,所以它最终会在典型配置下创建文件为0644。)

  • 您需要将read 的返回值保存在某处,并将其作为第三个参数传递给write(而不是bufferSize)。否则,您的程序将写入比读取更多的字节,例如复制小文件时。

  • 从技术上讲,您应该检查来自write() 的返回值。就像read() 一样,不能保证每次调用都完成完整的写入。 (实际上,在处理常规文件时,它总是会完成写入或返回错误,但在某些深奥的情况下可能并非如此。)

  • 从缓冲区写入后,您不需要bzero()

【讨论】:

  • 太棒了,谢谢!我设法在添加更多代码的同时解决了这个问题。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2013-01-03
相关资源
最近更新 更多