ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ write()
    C,C++ & Linux 2020. 5. 14. 14:23
    728x90

    write(2) 함수 기능

    파일에 write 하는 시스템 함수입니다.

    함수 원형

    #include <unistd.h>
    #include <sys/types.h>
    
    ssize_t write(int fd, const void *buf, size_t nbytes);

    매개변수

    fd

    대상 파일 디스크립터

     

    buf

    쓰고자 하는 데이터가 담긴 버퍼

     

    nbytes

    쓰고자 하는 데이터의 길이 ( buf의 길이보다 길어선 안됨 )

    반환값

    성공 시 실제로 쓰여진 데이터의 길이 리턴

    에러 시 -1 리턴 후 errno 설정

     

    -1 이 아니더라도 자신이 쓰고자 한 데이터의 길이 nbytes 보다 적게 쓰여졌다면 에러라고 볼 수 있습니다.

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h> // for open
    #include <sys/types.h>
    #include <sys/stat.h>
    
    #define BUFFER_SIZE 1024
    
    int main() {
        char buf[BUFFER_SIZE];
        int length;
    
        // 0번 파일(표준 입력) 에서 입력을 받아옴
        length = read(0, buf, BUFFER_SIZE);
        
        // 1번 파일(표준 출력)으로 출력함
        if (write(1, buf, length) != length) {
            fprintf(stderr, "write error\n");
            exit(1);
        }
    	exit(0);
    }
    

    결과

     

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h> // for open
    #include <sys/types.h>
    #include <sys/stat.h>
    
    #define S_MODE 0644
    #define BUFFER_SIZE 1024
    
    int main(int argc, char *argv[]) {
        char buf[BUFFER_SIZE];
        int fd1, fd2;
        int length;
    
        if (argc != 3) {
            fprintf(stderr, "Usage : %s file fileout\n", argv[0]);
            exit(1);
        }
    
    	// argv[1]을 읽기모드로 열기
        if ((fd1 = open(argv[1], O_RDONLY)) < 0) {
            fprintf(stderr, "%s open error\n", argv[1]);
            exit(1);
        }
    
    	// argv[2]를 쓰기, 파일 생성, 이미 있었다면 다 지우고 처음부터 작성하는 모드로 열기
        if ((fd2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_MODE)) < 0) {
            fprintf(stderr, "%s open error\n", argv[2]);
            exit(1);
        }
    
    	// fd1 을 처음부터 끝까지 읽어서
        while ((length = read(fd1, buf, BUFFER_SIZE)) > 0)
    		// fd2 에 그대로 출력
            write(fd2, buf, length);
    
    	exit(0);
    }
    

    결과

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h> // for open
    #include <sys/types.h>
    #include <sys/stat.h>
    #include "ssu_employee.h"
    
    
    int main(int argc, char *argv[]) {
        struct ssu_employee record;
        int fd;
    
        if (argc < 2) {
            fprintf(stderr, "usage : %s file\n", argv[0]);
            exit(1);
        }
    
        // argv[1]을 쓰기, 파일 생성 but 이미 있으면 생성하지 않음 모드로 열기
        if ((fd = open(argv[1], O_WRONLY | O_CREAT | O_EXCL, 0640)) < 0) {
            fprintf(stderr, "%s open error\n", argv[1]);
            exit(1);
        }
    
        while (1) {
            printf("Enter employee name <SPACE> salary: ");
            scanf("%s", record.name);
    
            // 사람 이름을 .으로 입력하면 프로그램 종료
            if (record.name[0] == '.')
                break;
    
            // 연봉을 입력
            scanf("%d", &record.salary);
            record.pid = getpid();
    
            // 입력받은 정보를 fd에 저장
            write(fd, (char *)&record, sizeof(record));
        }
        close(fd);
    	exit(0);
    }
    

    결과

     

     

     

     

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ dup()  (0) 2020.05.16
    C/C++ pread(), pwrite()  (0) 2020.05.14
    C/C++ close() 함수  (0) 2020.05.14
    C/C++ read 함수 - 파일을 읽는 함수  (0) 2020.04.22
    C/C++ lseek 함수 - 파일 커서(seek pointer) 조정  (0) 2020.04.22

    댓글

Designed by Tistory.