• 시스템 프로그래밍 C.2

    2021. 5. 28.

    by. 공상개발

    파일 입출력 함수 <stdio.h>

    형식 #include <stdio.h>
    FILE *fopen(const char *pathname, const char *mode);
    int fclose(FILE *fp);
    인수 pathname : 열거나 생성하고자 하는 파일 이름
    mode : 파일 열기 모드
    fp : 파일을 열 때 반환되는 파일 포인터
    기능 fopen()은 파일을 열거나 생성하고, fclose()는 파일을 닫는다.
    반환값 fopen()은 성공하면 파일 포인터를 반환하고, 실패하면 NULL을 반환
    fclose()는 성공하면 0을 반환하고, 실패하면 EOF를 반환

     

    모드 설명
    “r” 읽기 모드로 연다.
    “w” 쓰기 모드로 연다. 파일이 존재하면 내용이 모두 지워지고, 존재하지 않으면 새로 생성된다.
    “a” 추가 모드로 연다. 파일이 존재하면 데이터가 끝에 추가되고, 존재하지 않으면 새로 생성된다.
    “r+” 읽기 모드로 연다. 파일은 반드시 존재해야 하고, 쓰기도 가능하다.
    “w+” 쓰기 모드로 연다. 파일이 존재하면 내용이 지워지고, 읽기도 가능하다.
    “a+” 추가 모드로 연다. 파일의 끝에 데이터가 추가되고, 파일이 없으면 새로 생성되며, 읽기도 가능하다.
    “t” 텍스트 파일 모드로 연다.
    “b” 이진 파일 모드로 연다.

     

    이진 파일 입출력 함수

    형식 #include <stdio.h>
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,
    FILE *fp);
    인수 ptr : 메모리 주소
    size : 읽거나 쓸 데이터 항목의 크기
    nmemb : 데이터 항목의 수
    fp : 파일 포인터
    기능 fread()는 파일에서 데이터를 읽고, fwrite()는 파일에 데이터를 쓴다.
    반환값 fread() : 실제 읽은 레코드 수
    fwrite() : 실제 쓴 레코드 수

     

    텍스트 파일 입출력 함수

    함수 설명
    fgetc(fp) 파일 fp에서 문자를 읽는다.
    fputc(c, fp) 문자 c를 파일 fp에 저장한다.
    fgets(buf, n, fp) 파일 fp에서 n 바이트의 문자열을 읽어 buf에 저장한다.
    fputs(buf, fp) buf에 있는 문자열을 파일 fp에 저장한다.
    fscanf(fp, ...) 파일 fp에서 자료를 변환하여 읽는다.
    fprintf(fp, ...) 자료를 변환하여 파일 fp에 저장한다.
    feof(fp) 파일 fp의 끝인지를 검사한다.

     

    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
    34
    35
    36
    37
    38
    39
    40
    41
    hjw@Desktop:~/work/ch6$ ls
    file1  p6_1  p6_1.c  p6_2  p6_2.c  p6_3  p6_3.c  p6_4  p6_4.c  p6_5.c
    hjw@Desktop:~/work/ch6$ gcc -o p6_5 p6_5.c
    hjw@Desktop:~/work/ch6$ cat p6_5.c
    // File : p6_5.c
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        FILE *fp1, *fp2;
        int ch;
     
        // file1을 읽기 모드로 연다.
        fp1 = fopen("file1""r");
        if (fp1 == NULL) {
            printf("file1을 열 수 없습니다.\n");
            exit(1);
        }
     
        // file2를 쓰기 모드로 연다.
        fp2 = fopen("file2""w");
        if (fp2 == NULL) {
            printf("file2를 생성할 수 없습니다.\n");
            exit(2);
        }// file1에서 읽어 file2에 저장한다.
        while ((ch = fgetc(fp1)) != EOF) {
            fputc(ch, fp2);
        }
     
        // file1과 file2를 닫는다.
        fclose(fp1);
        fclose(fp2);
     
        return 0;
    }
    hjw@Desktop:~/work/ch6$ ./p6_5
    hjw@Desktop:~/work/ch6$ cat file2
    test String
     
    cs

     

     

    메모리 할당 / 해제 함수

    형식 #include <stdlib.h>
    void *malloc(size_t size);
    void free(void *ptr);
    void *calloc(size_t nmemb, size_t size);
    void *realloc(void *ptr, size_t size);
    인수 size : malloc()realloc()의 경우에는 할당할 메모리의 크기, calloc()의 경우에는 할당할 레코드 하나의 크기.
    nmemb : 할당할 레코드의 수
    ptr : free()의 경우에는 해제할 메모리의 주소, realloc()의 경우에는 이전에 할당한 메모리의 주소
    기능 malloc() : 메모리를 할당한다.
    calloc() : 메모리를 할당하고 전체를 0으로 초기화 한다.
    realloc() : 메모리를 새로 할당하고 이전 메모리의 내용을 복사한다.
    free() : 메모리를 해제한다.
    반환값 malloc(), calloc(), realloc() : 성공하면 할당된 메모리의 주소, 실패하면 NULL
    free() : 반환값이 없음.

     

    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
    hjw@Desktop:~/work/ch6$ ls
    file1  p6_1    p6_2    p6_3    p6_4    p6_5    p6_6.c
    file2  p6_1.c  p6_2.c  p6_3.c  p6_4.c  p6_5.c
    hjw@Desktop:~/work/ch6$ gcc -o p6_6 p6_6.c
    hjw@Desktop:~/work/ch6$ cat p6_6.c
    // File : p6_6.c
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        char *mp;
        char *str = "Dynamic memory allocation.";
     
        //메모리 할당
        mp = (char *)malloc(strlen(str) + 1);
        if (mp == NULL) {
            perror("malloc()");
            exit(0);
        }
        // 문자열을 할당된 메모리에 복사
        strcpy(mp, str);
     
        printf("메모리의 내용 : %s\n", mp);
        // 메모리 해제
        free(mp);
     
        return 0;
    }
    hjw@Desktop:~/work/ch6$ ./p6_6
    메모리의 내용 : Dynamic memory allocation.
    cs

     

    시스템 콜(system call)

    • 시스템 콜은 커널로의 진입점(entry point)이다.
    • 커널이 사용자 수준의 응용 프로그램들에게 서비스를 제공하는 인터페이스이다.
    • 리눅스는 POSIX에서 정의된 모든 시스템 콜을 제공한다.

     

    시스템 콜의 동작 원리

    • 시스템 콜은 트랩(일종의 인터럽트)으로 처리된다.

     

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    hjw@Desktop:~/work/ch6$ ls
    file1  p6_1    p6_2    p6_3    p6_4    p6_5    p6_6    p6_7.c
    file2  p6_1.c  p6_2.c  p6_3.c  p6_4.c  p6_5.c  p6_6.c
    hjw@Desktop:~/work/ch6$ gcc -o p6_7 p6_7.c
    hjw@Desktop:~/work/ch6$ cat p6_7.c
    // File : p6_7.c
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
     
    #define FMODE    0666
    #define RWSIZE    64
    int main(int argc, char *argv[])
     
    {
        int fd_src, fd_dest, size;
        char buf[RWSIZE];
     
        if (argc != 3) {
            fprintf(stderr, "Usage : %s src dest\n", argv[0]);
            exit(1);
        }
      if ((fd_src = open(argv[1], O_RDONLY)) < 0) {
            perror(argv[1]);
            exit(2);
        }
     
        if ((fd_dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC,
           FMODE)) < 0) {
            perror(argv[2]);
            exit(3);
        }
     
        while ((size = read(fd_src, buf, RWSIZE)) > 0) {
            write(fd_dest, buf, size);
        }
     
        close(fd_dest);
        close(fd_src);
    }
    hjw@Desktop:~/work/ch6$ ./p6_7 file1 file2
     
    cs

     

    'Computer Science > Linux' 카테고리의 다른 글

    시스템 관리 (3)  (0) 2021.06.05
    시스템 관리 (2)  (0) 2021.06.01
    시스템 프로그래밍 C.1  (0) 2021.05.28
    시스템 관리 (1)  (0) 2021.05.25
    쉘 프로그래밍 명령어 모음 3  (0) 2021.05.11

    댓글