C||C++

시스템프로그래밍 중간정리(lect 6)

Yongbaldae 2023. 5. 16. 15:31

File system calls

open,read,write function 이 함수들을 사용하기 위해서는 다음과 같은 헤더파일들이 필요하다.

#include <fcntl.h> // 파일 제어에 필요한 상수와 함수들을 정의합니다.
#include <sys/stat.h> // 파일의 상태에 관한 정보를 가져오는데 필요한 구조체와 함수를 정의합니다.
#include <sys/types.h> // 여러 가지 데이터 타입과 관련된 typedef 선언을 포함하고 있습니다
#include <unistd.h> // POSIX (Portable Operating System Interface) 운영체제 API에 관한 많은 함수, 상수, 타입들을 정의하고 있습니다.

 

int main(){
   int x, y;
   char buf[20];
 
   x=open("f1", O_RDONLY, 00777); // f1을 오직 읽는용도를 엽니다. x에는 파일번호로 3이상의 숫자가 부여됩니다.
// 만일 열기를 실패하면 -1을 부여합니다. 또한 0: standard input file, 1: standard output file, 2: standard error file
   y=read(x, buf, 20);
// 20바이트를 x로부터 읽고, buf 배열에 20바이트짜리 문자열을 담아둡니다. y에는 읽은 바이트수가 저장됩니다.
   write(1, buf, y); // 버프에서 y바이트만큼을 읽어서 1번(터미널을 의미)에 작성합니다.
   return 0;
}

 

copy all data from f1 to f2. Check "f2" with "cat f2".

 

#include <fcntl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h> //시스템콜을 할 때 필수적으로 위 4개의 헤더파일이 필요하다.

#include <stdio.h>

#include <string.h>

 

int main(){

   int x1, x2, y; //x1,x2에는 파일넘버가 들어갈 것이고, y에는 읽은 바이트수가 들어갈 예정.

   char buf[50];

 

   x1=open("f1", O_RDONLY, 00777); // open f1 for reading

   x2=open("f2", O_RDWR | O_CREAT | O_TRUNC, 00777); // f2를 읽고 쓰기용으로 열고, create,truncate하라. 

   for(;;){

      y=read(x1, buf, 20); // read max 20 bytes from f1

      if (y==0) break; // if end-of-file, get out

      write(x2, buf, y); // write to f2

   }

   return 0;

}

 

--------------------------------------------------------------------------------------------------

 

x=open("f8", O_CREAT|O_RDWR|O_TRUNC, 00777);

write(x, "ab", 2); //f8에 ab를 쓴다.

int y=10;

write(x, &y, 4); //f8에 y에 들어있는 10을 쓴다. 하지만 아스키코드 상에 존재하는 10은 줄바꿈문자이므로 4바이트를 줄바꿈문자 하나로 퉁친다.

write(x, "cd", 2);//f8에 cd를 쓴다

y=235;

write(x, &y, 4); //f8에 235를 쓰고싶지만, 아스키코드 상으로 235는 존재하지 않기때문에 이상한 문자가 써진다.

//write함수를 사용할 때 xxd를 이용하여 어떻게 쓰여지는지 확인했다. xxd로는 알맞은 값이 들어가지만, 아스키코드로 바꾸는 과정에서 아스키테이블에 존재하지 않는 문자들은 이상하게 쓰여진다.