使用open(),read()和write()系统调用来复制文件

时间:2017-11-19 01:22:02

标签: c pthreads

我无法使用read()write()open()将文件复制到新目录中。我能够使用open()创建一个新文件,并且我能够使用write()写入终端,但我假设我从int传递了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); } 文件描述符打开写入,写入将写入指定的文件。

除此之外,一旦我打开文件,权限都很时髦,我只能以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_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);
}

修正了问题:

更新的代码:

{{1}}

1 个答案:

答案 0 :(得分:3)

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()缓冲区。

相关问题