2011-01-09 3 views
8

上の読み取り/書き込み権限を。変更は、私はLinuxのCプロジェクトに取り組んでいると私はファイルディスクリプタでの作業のトラブルを抱えているファイルディスクリプタ

私は孤立ファイル記述子を持っています(ファイルはopen()されてからunlink()されていますが、fdはまだ有効です)、書き込み専用です。元のバッキングファイルには完全なアクセス許可(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTHで作成)がありましたが、ファイルはO_WRONLYで開かれていました。ファイルディスクリプタを複製し、コピーをO_RDWRに変更することは可能ですか?

psudoコード:事前に


//open orphan file 
int fd = open(fname, O_WRONLY, ...) 
unlink(fname) 
//fd is still good, but I can't read from it 

//... 

//I want to be able to read from orphan file 
int fd2 = dup(fd) 
//----change fd2 to read/write???---- 

ありがとう! -Andrew

+4

'fcntl(fd、F_SETFL、fcntl(fd、F_GETFL)| O_RDWR))' *は、manページが特に動作しないと言っている点を除いて、それは事と同様です。私は、カーネルにはこれが不可能であることを「必要とする」何らかの理由があると思いますか? – aschepler

+2

なぜあなたはそれを読む予定がある場合wronlyモードでそれを開きますか? –

+0

また、適切なフラグを使用して再度開くこともできます。 – jweyrich

答えて

6

いいえ、オープンモードを変更するPOSIX関数はありません。それを読み書きモードで開く必要があります。ただし、一時ファイルが作成されているので、mkstempを使用することを強くお勧めします。この関数は、ファイルを読み取り/書き込みモードで適切に開き、のリンクを解除します。最も重要なことは、ファイルの命名と作成における競合状態を避けることで、一時ファイルの作成における脆弱性を回避することです。

+2

mkstempはAFAIKのリンクを解除しませんか? –

+0

MKは言った。 open()にO_EXCLを追加して失敗時に再試行できます –

関連する問題