creatは、openと同じでファイルを開くわけだが、openの第2引数に、O_CREAT|O_WRONLY|O_TRUNCのオプションを付けた状態と同じなので、既に存在しているファイルはサイズを0に切り詰めて、上書き保存のような形になる。
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ #include <unistd.h> /* UNIX標準 */ #include <sys/types.h> /* 派生型 */ #include <sys/stat.h> /* ファイル状態 */ #include <fcntl.h> /* ファイル制御 */ /* main関数の定義 */ int main(void){ /* 変数の宣言 */ int fd1; /* ファイルディスクリプタfd1 */ /* ファイルを作成し, 書き込み. */ fd1 = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); /* openで"test.txt"を作成し, 開く. */ if (fd1 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(1)"); /* "open(1)とエラー内容をエラー出力. */ return -1; /* -1を返す. */ } /* "ABCDE"を書き込む. */ write(fd1, "ABCDE", 5); /* writeで"ABCDE"を書き込む. */ /* 閉じる. */ close(fd1); /* closeでfd1を閉じる. */ /* プログラムの終了 */ return 0; /* 0を返す. */ }
新規作成として、同じオプションをopenに指定。
$ vi creat.c $ gcc creat.c -o creat $ ./creat $ ls creat creat.c test.txt $ cat test.txt ABCDE$
新規作成され文字列が書き込まれる。
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ #include <unistd.h> /* UNIX標準 */ #include <sys/types.h> /* 派生型 */ #include <sys/stat.h> /* ファイル状態 */ #include <fcntl.h> /* ファイル制御 */ /* main関数の定義 */ int main(void){ /* 変数の宣言 */ int fd1; /* ファイルディスクリプタfd1 */ int fd2; /* ファイルディスクリプタfd2 */ char buf[32]; /* サイズ32のchar型配列バッファbuf. */ /* ファイルを作成し, 書き込み. */ fd1 = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); /* openで"test.txt"を作成し, 開く. */ if (fd1 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(1)"); /* "open(1)とエラー内容をエラー出力. */ return -1; /* -1を返す. */ } /* "ABCDE"を書き込む. */ write(fd1, "ABCDE", 5); /* writeで"ABCDE"を書き込む. */ /* 閉じる. */ close(fd1); /* closeでfd1を閉じる. */ /* ファイルを読み込み専用で開く. */ fd2 = open("test.txt", O_RDONLY); /* openで"test.txt"を読み込み専用で開く. */ if (fd2 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(2)"); /* "open(2)とエラー内容をエラー出力. */ return -2; /* -2を返す. */ } /* "ABCDE"を読み込む. */ read(fd2, buf, 32); /* readで"ABCDE"を読み込む. */ /* bufを出力. */ printf("buf = %s\n", buf); /* printfでbufを出力. */ /* 閉じる. */ close(fd2); /* closeでfd2を閉じる. */ /* プログラムの終了 */ return 0; /* 0を返す. */ }
今度は読み込んでみる。
$ vi creat.c $ gcc creat.c -o creat $ ./creat buf = ABCDE $ ls creat creat.c test.txt $ cat test.txt ABCDE$
こうなる。
creatで開いて、"XYZ"を書き込む。
$ vi creat.c $ gcc creat.c -o creat $ ./creat buf = ABCDE $ ls creat creat.c test.txt $ cat test.txt XYZ$
"XYZ"に上書き保存されてる。
Sample/unixsyscall/creat/creat/src/creat at master · bg1bgst333/Sample · GitHub