4-3ファイルIO-システム関数(課題-1)
File Descriptor
の整数で、
システム管理
파일 디스크립터
が使用されます.システムコールアクセスを使用して
バイナリファイルとテキストファイル
open()
関数のプロトタイプ.
int open(const char* path, int flags)
int open(const char* path, int flags, mode_t mode)
機能既存のファイルを開くか、新しいファイルを作成する関数見出し
<sys/types.h> <sys/stat.h> <fcntl.h>
パラメータ1.const char* path
ターゲットファイル名パラメータ2.
int flags
ファイルのオープンオプションパラメータ
mode_t mode
O CREATオプションを使用してファイルを作成する場合、指定したファイルアクセス権(例:0644、0777)車に戻る.
(正常)ファイルが正常に開いた場合、ファイルディスクバッチの正の整数値が返されます.
(失敗)-1 errno
開くオプションは、O RDONLYがO WRONLYを読み取り専用で開くO RDWR読み書きすべてを読み取り専用で開くO CREATファイルが存在しない場合は、O EXCLを作成そのファイルが存在する場合は、O EXCLを生成ファイルが存在しない場合は、O TRUNCファイルが存在する場合は、そのファイルのすべてのコンテンツO APPEND書き込み操作をクリアすると、ファイルの最後にコンテンツ付加O NOCTYを開くターゲットが端末であれば、その端末をプログラムの制御端末として指定せず、O NONBLOCK読み取りがなければ、O SYNC書き込み動作が物理書き込み動作を完了するまで、読み出しコンテンツが直ちに戻るのを待たない
read()
関数のプロトタイプ.
ssize_t read(int fd, void* buf, size_t nbytes)
機能Open()関数で開いているファイルの内容を読み込みますnbytesがゼロの場合エラー
nbytesがSSIZE MAXより大きい場合、実装-定義
見出し.
パラメータ1.
int fd
ファイルのファイルディスク立棒パラメータ2.
void* buf
検索データを格納するためのバッファパラメータ
size_t nbytes
検索する最大データ長(bufの長さより大きくない)車に戻る.
取得データ長(バイト数)
nbytes回帰じゃない途中でファイルの末尾に遭遇すると、そこに読み込まれるからです.
(失敗)-1 errno
write()
関数のプロトタイプ.
ssize_t write(int fd, const void* buf, size_t nbytes
)機能ファイルの内容を作成
見出し.
パラメータ1.
int fd
open()、create()などで正常に開いているファイルディスクバッチパラメータ2.
const void* buf
に書き込むデータメモリ領域パラメータ
size_t nbytes
書き込みデータのサイズ車に戻る.
(成功)実際の書き込みデータのバイト数(0より大きい)
countと同じサイズの値を返します.
countより小さい場合は、信号を送信したり、書き込みスペースが不足したりします.
(0)エラーは発生しませんが、countが0の場合はファイルに書き込まれません.
(失敗)-1 errno
lseek()
関数のプロトタイプ.
off_t lseek(int fd, off_t offset, int whence)
機能ファイルの特定の場所から読み取りや書き込みを開始する場合に便利です.最初にファイルを開くと、最初のseek positionは0になります.
Open()がO APPENDをマークする場合、最初のseek位置はファイルの末尾にあります.
見出し.
パラメータ1.
int fd
調整するファイルのファイルディスク立棒パラメータ2.
off_t offset
ベーシスポイントから移動する距離パラメータ
int whence
ベーシスポイントSEEK SET(0):ファイルの先頭
SEEK CUR(1):現在のSeekポインタ
SEEK END(2):ファイルの末尾
車に戻る.
成功時のSeek pointer位置
(失敗)-1 errno
lseek(fd, 10, SEEK_SET); //파일의 시작에서 10번을 건너뛴다.
lseek(fd, -8, SEEK_END); //파일의 끝에서 앞으로 8번을 건너뛴다.
lseek(fd, 5, SEEK_CUR); //현재 위치에서 다시 5번을 건너뛴다.
close()
関数のプロトタイプ.
int close(int fd)
機能Open()関数を使用して開いているファイルを停止します.見出し.
パラメータ.
int fd
ファイルディスク立棒車に戻る.
0正常に閉じる
(失敗)-1
課題-1
my cpファイルのコピー
#include <stdio.h>
#include <errno.h>
#include <sys/types.h> //open()
#include <sys/stat.h> //open()
#include <fcntl.h> //open()
#include <unistd.h> //read() write() close()
#include <string.h> //strcmp()
enum { BUF_SIZE = 300 };
void Usage()
{
printf("Usage: c [-f] src_file dest_file\n");
printf(" -f: dest_file 존재시 src_file 내용으로 바꿈\n");
}
int main(int argc, char* argv[])
{
if (argc != 3 && argc != 4) {
Usage();
return EIO;
}
if (argc == 4 && (strcmp(argv[1], "-f") != 0)) {
Usage();
return EIO;
}
int src = 0;
int dest = 0;
char buf[BUF_SIZE];
int f = 0;
if (strcmp(argv[1], "-f") == 0) {
f = 1;
}
if ((src = open(argv[1 + f], O_RDWR)) == -1) {
printf("No such file\n");
return ENOENT;
}
if (f == 0) {
if ((dest = open(argv[2 + f], O_RDWR | O_CREAT | O_EXCL, 0777)) == -1) {
printf("Copy fail (%s existed)\n", argv[2 + f]);
return EEXIST;
}
}
else if (f == 1) {
if ((dest = open(argv[2 + f], O_RDWR | O_CREAT | O_TRUNC, 0777)) == -1) {
printf("Copy fail (can't access)\n");
return EACCES;
}
}
if (read(src, buf, BUF_SIZE - 1) == -1) {
return EFAULT;
}
if (write(dest, buf, strlen(buf) - 1) == -1) {
return EFAULT;
}
else {
printf("Copy success!!!\n");
}
if (close(src) == -1) {
return EBADF;
}
if (close(dest) == -1) {
return EBADF;
}
return 0;
}
Reference
この問題について(4-3ファイルIO-システム関数(課題-1)), 我々は、より多くの情報をここで見つけました https://velog.io/@doheeklm/4-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol