4-3ファイルIO-システム関数(課題-1)


File Descriptor


の整数で、
  • システムから割り当てられたファイルを表します.
    システム管理
  • ファイルに必要なファイルの情報を含む制御ブロック.
  • ファイルは独立して存在し、異なるシステム構造を有する可能性がある.
  • は、通常、セカンダリメモリに格納され、ファイルが開くとプライマリメモリに移動する.
  • プロセスがファイルを処理する際に使用する概念は、プロセスが特定のファイルにアクセスする際に使用する抽象値である.
  • は、通常、非負の整数を有する.
  • REGファイル、DIR、コンセント、パイプ、ブロックデバイス、およびロールデバイスがファイルとして管理され、プロセスがこれらのファイルにアクセスすると파일 디스크립터が使用されます.
  • プロセスが実行中にファイルを開くと、カーネルはそのプロセスにファイルディスクバッチで使用されていない最小値を割り当てます.
    システムコールアクセスを使用して
  • プロセスを開いたファイルにアクセスする場合、ファイルディスクバッチ(fd)値を使用してファイルを指定できます.
  • デフォルトで割り当てられたfdは、標準入力(0)、標準出力(1)、標準エラー(2)である.

    バイナリファイルとテキストファイル

  • バイナリファイル
  • データファイル
  • すべてのファイルは0と1で構成されています.
  • ファイル構成フォーマットには特別な条件はありません.そのため、ほとんどのデータはサイズで計算されます.
  • データファイル(.dat)、実行可能ファイル(.exe)、イメージファイル(.png)、バイナリファイル(.bin)など
  • .
  • テキストファイル
  • 文字ファイル
  • の大部分はASCII文字または文で構成されています.
  • ソースファイル(.cpp)、README.txt等
  • 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;
    }