write
OS/리눅스 & 유닉스 2011. 12. 23. 13:24write(2)
파일기술자가 가리키는 파일에 쓴다. 이 파일기술자는 open(2), socket(2) 등으로 얻을수 있다.
1.2절. 설명
첫번째 아규먼트인 fd 는 열린파일 기술자이다. 이것은 보통 open(2), socket(2) 등으로 만들어지며, 때때로 pipe(2) 등으로 만들어지기도 한다.
두번째 아규먼트는 fd 로 쓸 데이타이며, count 는 fd 쓸 데이타의 크기이다.
1.3절. 반환값
성공할경우 쓰여진 바이트 만큼이 리턴된다. 0이면 쓰여진것이 없음을 나타내며, -1 일경우는 에러가 발생했을 경우이다. 에러가 발생했을경우에는 errno 에 적당한 값이 설정된다.
1.4절. 에러
다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.
- EBADF
fd 가 유효한 파일 기술자가 아니거나 쓰여질수 없도록 열려있을경우
- EINVAL
fd 가 쓰기에 적당하지 않은 객체와 연결되어 있을경우
- EFAULT
buf 가 접근할 수 없는 주소 공간을 가리키고 있을때
- EPIPE
fd 가 끝이 닫혀진 소켓이나 파이프에 연결되어 있을때. 쓰고 있는 프로세스가 SIGPIPE signal를 받았을때 발생한다.
- EAGAIN
fd 가 비봉쇄(O_NONBLOCK) 로 열렸을경우, 데이터를 쓰기 위해 fd 와 연결된 파이프나 소켓에 공간이 없을때, 발생한다. 봉쇄로 열렸을경우에는 연결된 파이프나 소켓에 공간이 있을때까지 봉쇄된다.
- EAGAIN
fd 가 비봉쇄(O_NONBLOCK) 로 열렸을경우, 데이터를 쓰기 위해 fd 와 연결된 파이프나 소켓에 공간이 없을때, 발생한다. 봉쇄로 열렸을경우에는 연결된 파이프나 소켓에 공간이 있을때까지 봉쇄된다.
1.5절. 예제
#include <fcntl.h> #include <unistd.h> #include <stdio.h> struct data { int age; char name[25]; }; int main() { int fd; int n; struct data mydata, readdata; fd = open("data.txt", O_CREAT|O_RDWR); if (fd == -1) { perror("open error : "); } mydata.age = 25; strcpy(mydata.name, "hello"); n = write(fd, (void *)&mydata, sizeof(mydata)); close(fd); } |