-
C/C++ write()C,C++ & Linux 2020. 5. 14. 14:23728x90
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