[英]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.