C LANGUAGE TECHNOLOGY

【C言語】一時ファイルを作成するtmpfile関数とmkstemp関数,一時ディレクトリを作成するmkdtemp関数の使い方

悩んでいる人

C言語で一時ファイルと一時ディレクトリの作成方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

一時ファイルを作成するtmpfile関数とmkstemp関数

一時ファイルを作成するtmpfile関数とmkstemp関数を紹介します.

tmpfile関数

tmpfile関数は,ユニークな一時ファイルをバイナリリードライトモード (w+b) でオープンします.

このファイルはクローズ時またはプログラムの終了時に自動的に削除されます.

tmpfile関数では,stdio.hで定義されているP_tmpdir(/tmpの場合が多い)をパスの先頭にしたディレクトリを作成します.

ここで,tmpfile関数で作成した一時ファイルは,ファイルシステムでは読めないので注意して下さい.

tmpfile関数の返り値は,ファイルポインタです.

tmpfile関数の使い方は以下になります.

実行結果の例は以下になります.

getchar関数でプログラムを実行中に停止するようにしています.

プログラムをCtrl + Z(^Z)で中断した後に/tmpディレクトリをls -alで表示しても,一時ファイルは見つかりませんね.

なのでfgでプログラムを再開して終了しました.

mkstemp関数

mkstemp関数は,引数templateから他と重ならない一時ファイル名を生成し,そのファイルの作成とオープンを行い,そのファイルに対するオープン済みのファイルディスクリプタを返します.

引数templateで指示する文字列の後ろの6文字はXXXXXXである必要があります.

この部分がファイル名を他と重ならないようにする文字で置き換えられます.

templateは書き換えられるため,文字列定数ではなく文字配列として定義しなければなりません.

ファイルは許可モード0600で作成され,所有者のみが読み書き可能です.

返されるファイルディスクリプタで,このファイルへの読み書き両方のアクセスが可能になります.

呼び出し者がそのファイルを作成するプロセスであることを保証するために,ファイルはopen関数のO_EXCLフラグ付きでオープンされます.

mkstemp関数は,一時ファイルのファイルディスクリプタを返します.

tmpfile関数とは異なり,mkstemp関数で作成したファイルはlsコマンドで確認することができ,プログラム終了後にも残ります.

mkstemp関数の使い方は以下になります.

実行結果の例は以下になります.

abs-XL3RQTファイルが作成され,その中身がabcであることがわかります.

一時ディレクトリを作成するmkdtemp関数

mkdtemp関数は,他と重ならない名前の一時ディレクトリをtemplateから作成します.

templateの後から6文字はXXXXXXでなければなりません.

この部分はディレクトリ名を他と重ならなくするための文字列で置き換えられます.

ディレクトリは許可属性を0700として作成されます.

templateは変更されるので,文字列定数にしてはならず,文字配列でなければなりません.

mkstemp関数と同様に,mkdtmp関数で作成したディレクトリはlsコマンドで確認することができ,プログラム終了後にも残ります.

mkdtmp関数の使い方は以下になります.

実行結果の例は以下になります.

abc-zVg9ogディレクトリが作成されていることがわかります.

まとめ

C言語で一時ファイルを作成するtmpfile関数とmkstemp関数,一時ディレクトリを作成するmkdtemp関数の使い方を紹介しました.

一時ファイルや一時ディレクトリを作成したい時に参考にして下さい.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,