C言語で一時ファイルと一時ディレクトリの作成方法を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
一時ファイルを作成するtmpfile関数とmkstemp関数
一時ファイルを作成するtmpfile関数とmkstemp関数を紹介します.
tmpfile関数
1 |
FILE *tmpfile(void); |
tmpfile関数は,ユニークな一時ファイルをバイナリリードライトモード (w+b) でオープンします.
このファイルはクローズ時またはプログラムの終了時に自動的に削除されます.
tmpfile関数では,stdio.hで定義されているP_tmpdir(/tmpの場合が多い)をパスの先頭にしたディレクトリを作成します.
ここで,tmpfile関数で作成した一時ファイルは,ファイルシステムでは読めないので注意して下さい.
tmpfile関数の返り値は,ファイルポインタです.
tmpfile関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> #define PATH_MAX 128 #define STR "abc\n" int main(void) { FILE *fp; printf("P_tmpdir = %s\n", P_tmpdir); if ((fp = tmpfile()) == NULL) { perror("tmpfile"); exit(1); } fprintf(fp, STR); getchar(); return 0; } |
実行結果の例は以下になります.
getchar関数でプログラムを実行中に停止するようにしています.
プログラムをCtrl + Z(^Z)で中断した後に/tmpディレクトリをls -alで表示しても,一時ファイルは見つかりませんね.
なのでfgでプログラムを再開して終了しました.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$ gcc tmpfile.c c$ a.out P_tmpdir = /tmp ^Z suspended a.out $ ls -al /tmp total 96 drwxrwxrwt 22 root root 4096 Jun 11 16:54 ./ drwxr-xr-x 20 root root 4096 Apr 22 16:45 ../ drwxrwxrwt 2 root root 4096 Jun 11 08:32 .ICE-unix/ drwxrwxrwt 2 root root 4096 Jun 11 08:32 .Test-unix/ -r--r--r-- 1 gdm gdm 11 Jun 11 08:32 .X1024-lock -r--r--r-- 1 gdm gdm 11 Jun 11 08:32 .X1025-lock drwxrwxrwt 2 root root 4096 Jun 11 08:32 .X11-unix/ drwxrwxrwt 2 root root 4096 Jun 11 08:32 .XIM-unix/ drwxrwxrwt 2 root root 4096 Jun 11 08:32 .font-unix/ drwxrwxrwt 2 root root 4096 Jun 11 08:32 VMwareDnD/ drwx------ 3 root root 4096 Jun 11 08:32 snap.snapd-desktop-integration/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-ModemManager.service-OyWMhc/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-bluetooth.service-YDr0Re/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-colord.service-3Wz0in/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-power-profiles-daemon.service-99EFWa/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-switcheroo-control.service-oc75jW/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-systemd-logind.service-kTOpxW/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-systemd-oomd.service-nn5zKt/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-systemd-resolved.service-x8HhsD/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-systemd-timesyncd.service-4n0jQA/ drwx------ 3 root root 4096 Jun 11 08:32 systemd-private-a97b8bb7bfae43979425ba64c9932aaa-upower.service-9NttgG/ drwx------ 2 chishiro chishiro 4096 Jun 11 13:53 tracker-extract-3-files.1000/ drwx------ 2 gdm gdm 4096 Jun 11 08:32 tracker-extract-3-files.127/ drwx------ 2 root root 4096 Jun 11 08:32 vmware-root_998-2999526240/ $ fg [1] + continued a.out |
mkstemp関数
1 |
int mkstemp(char *template); |
mkstemp関数は,引数templateから他と重ならない一時ファイル名を生成し,そのファイルの作成とオープンを行い,そのファイルに対するオープン済みのファイルディスクリプタを返します.
引数templateで指示する文字列の後ろの6文字はXXXXXXである必要があります.
この部分がファイル名を他と重ならないようにする文字で置き換えられます.
templateは書き換えられるため,文字列定数ではなく文字配列として定義しなければなりません.
ファイルは許可モード0600で作成され,所有者のみが読み書き可能です.
返されるファイルディスクリプタで,このファイルへの読み書き両方のアクセスが可能になります.
呼び出し者がそのファイルを作成するプロセスであることを保証するために,ファイルはopen関数のO_EXCLフラグ付きでオープンされます.
mkstemp関数は,一時ファイルのファイルディスクリプタを返します.
tmpfile関数とは異なり,mkstemp関数で作成したファイルはlsコマンドで確認することができ,プログラム終了後にも残ります.
mkstemp関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define STR "abc\n" int main(void) { int fd; char template[] = "abc-XXXXXX"; if ((fd = mkstemp(template)) == -1) { perror("mkstemp"); exit(1); } printf("template = %s\n", template); write(fd, STR, sizeof(STR)); return 0; } |
実行結果の例は以下になります.
abs-XL3RQTファイルが作成され,その中身がabcであることがわかります.
1 2 3 4 5 6 7 |
$ gcc mkstemp.c $ a.out template = abc-XL3RQT $ ls a.out* abc-XL3RQT mkdtemp.c mkstemp.c tmpfile.c $ cat abc-XL3RQT abc |
一時ディレクトリを作成するmkdtemp関数
1 |
char *mkdtemp(char *template); |
mkdtemp関数は,他と重ならない名前の一時ディレクトリをtemplateから作成します.
templateの後から6文字はXXXXXXでなければなりません.
この部分はディレクトリ名を他と重ならなくするための文字列で置き換えられます.
ディレクトリは許可属性を0700として作成されます.
templateは変更されるので,文字列定数にしてはならず,文字配列でなければなりません.
mkstemp関数と同様に,mkdtmp関数で作成したディレクトリはlsコマンドで確認することができ,プログラム終了後にも残ります.
mkdtmp関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> int main(void) { char template[] = "abc-XXXXXX"; char *dir; if ((dir = mkdtemp(template)) == NULL) { perror("mkdtemp"); exit(1); } printf("mkdtemp() = %s\n", dir); return 0; } |
実行結果の例は以下になります.
abc-zVg9ogディレクトリが作成されていることがわかります.
1 2 3 4 5 |
$ gcc mkdtemp.c $ a.out mkdtemp() = abc-zVg9og $ ls a.out* abc-zVg9og/ mkdtemp.c mkstemp.c tmpfile.c |
まとめ
C言語で一時ファイルを作成するtmpfile関数とmkstemp関数,一時ディレクトリを作成するmkdtemp関数の使い方を紹介しました.
一時ファイルや一時ディレクトリを作成したい時に参考にして下さい.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!