簡體   English   中英

使用open(),read()和write()系統調用來復制文件

[英]Using open(), read() and write() system calls to copy a file

我在使用read()write()open()將文件復制到新目錄時遇到了麻煩。 我能夠使用open()創建一個新文件,並且我能夠使用write()終端但是我假設如果我將我的int文件描述符從open傳遞給write,write會寫入指定的文件。

除此之外,一旦我打開文件,權限都是時髦的,我只能以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);
}
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()緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM