[Linux]access와 기본함수

공부기록·2023년 9월 29일
0
post-thumbnail

📘리눅스 기본 명령어 정리


함수이름설명
open파일을 읽거나 쓸거나 생성하며 파일을 오픈한다.
create빈 파일을 생성한다.
close전에 열려있던 파일을 닫는다.
read해당 파일의 내용을 읽어 추출한다.
write해당 파일의 내용을 어딘가에 쓰거나 출력한다.
lseek해당 파일의 원하는 위치로 이동한다.
remove파일을 제거한다.



📘File Desciptor :


파일 디스크립터값은 음수가 아닌 수로 모든 파일에게는 부여되는데 이미 존재하는 파일을 열거나 새로운 파일을 생성할 때 이 값을 리턴한다.

  • 0-2는 이미 할당된 번호이다.

    file descriptorsysbolic constantdescribe
    0STDIN_FILENOStandard input
    1STDOUT_FILENOStandard output
    2STDERR_FILENOStandard error

📗 예시

#include <fcntl.h>
#include <unistd.h>

main()
{
    int fd;
    /*ssize_t는 signed size type으로 32bit인 int이다. 입출력 실패시 -1을 반환하는데 
    이 값의 타입이 ssize_t이므로 주로 입출력함수의 반환타입으로 설정된다.*/
    ssize_t nread;
    char buf[1024];

    fd = open(“data”, O_RDONLY); //data라는 파일을 읽기 전용으로 연다. 이때 이 파일의 file descriptor값이 반환된다.

    nread = read(fd, buf, 1024); //data 파일을 읽은 후 읽은 byte 수를 반환한다.

    close(fd); //date 파일을 닫는다.
        
        /*자세한 설명은 일단 생략.*/
}

✏️open(2) system call

#include <fcntl.h>

int open(const char *pathname, int flags [, mode_t mode]);

/*성공시 file descriptor 반환, 실패시 -1 반환
  • flags:
    • O_RDONLY : 읽기 전용으로 열린다.
    • O_WRONLY : 쓰기 전용으로 열린다.
    • O_RDWR : 읽기, 쓰기가 가능하도록 열린다.
    • 하나 이상은 설정되어야한다.
  • optional flags :
    • O_APPEND : 파일의 끝에서 입력이 가능하도록 한다.
    • O_CREAT : 파일이 존재하지 않으면 파일을 생성한다. 이때 mode 라는 세번째 인자가 필요한데 해당 파일의 권한을 설정해준다.
    • O_EXCL : O_CREAT 옵션과 함께 사용하면 기존에 없는 파일이라면 파일을 생성하지만 이미 파일이 존재할 경우 오류메시지를 출력한다.
    • O_TRUNC : 파일이 이미 존재할 경우 해당 파일의 내용을 초기화시킨다.

   fd = open(/tmp/newfile”, O_WRONLY|O_CREAT, 0644);
   /* if isExist(file) “file open” else “file create & open” */ 

   fd = open(/tmp/newfile”, O_WRONLY|O_CREAT|O_EXCL, 0644);
   /* if isExist(file) “open error” else “file create & open” */

   fd = open(/tmp/newfile”, O_WRONLY|O_CREAT|O_TRUNC, 0644);
   /* if isExist(file) “file truncate & open ” else “file create & open” */
   

    #include <stdlib.h>	//exit() 이용
    #include <fcntl.h>	//open() 이용

    char *file = “firstfile”;

    main()
    {
        int fd;
        if( (fd = open(file, O_RDWR)) == -1) //open 실패시
        {
            printf(“Couldn’t open %s\n”, file);
            exit(1);
        }

        exit(0);
    }

exit(1)과 exit(0)의 차이

  • 실행 발생시 에러가 발생하면 exit(1)을 실행시켜 강제종료 해주어야하고, 정상으로 종료된다면 exit(0)으로 끝낸다.

📘File Permission


  • r : read 권한
  • w : write 권한
  • x : execute 권한

  • test라는 파일을 생성하였다. 이때 유저의 권한은 read, write가 허용되었고 group과 others는 read만 허용된다.
  • chmod로 test 파일의 권한을 변경할 수 있다. (숫자로 변경시 8진수 이용)

✏️ creat(2) system call

#include <fcntl.h> 

int creat(const char *pathname [, mode_t mode]);

/*성공시 fd가 반환되고 실패시 -1이 반환된다.*/
  • 파일이 이미 존재하면 두번째 인자는 필요없다.
  • open과 다르게 이미 파일이 존재한다면 그 파일을 초기화시킨다.
  • 항상 RDONLY로 파일을 연다.

🖇️ 새로운 파일에 대한 소유자와 권한

  • 파일을 생성하려면 상위 폴더(파일)의 write 권한이 필요하다.
  • 누가 소유자인가?
    • 파일의 소유자는 해당 프로세스를 실행한 사람이다. (user-id)

✏️ close(2) system call

#include <unistd.h>

int close(int fd);

//성공시 0을 반환하고, 실패시 -1을 반환한다.

✏️ read(2) system call

#include <unistd.h>

ssize_t read(int fd, void *buffer, size_t n);

//성공시 읽은 바이트의 수를 반환하고, EOF일 경우 0이 반환되고, 실패시 -1을 반환하다.
  • fd의 값을 n byte만큼 읽어와 *buffer에 복사한다.

📗 예시

int fd;
ssize_t n1, n2, n3;
char buf1[512], buf2[512], buf3[512];

if( (fd = open(“test”, O_RDONLY)) == -1)
    return -1;

//f_offset = 0
n1 = read(fd, buf1, 512);	//n1 = 512, 512byte 읽음,f_offset = 512
n2 = read(fd, buf2, 512);	//n2 = 88, 55byte 읽음, f_offset = 600
n3 = read(fd, buf3, 512);	//n3 = 0, EOF

✏️write(2) system call

#include <unistd.h>

ssize_t write(int fd, const void *buffer, size_t n);

//성공시 작성한 byte만큼 반환되고, 실패시 -1이 반환된다.
  • memory에 있는 buffer의 값을 n만큼 복사하여 fd에 해당하는 파일에 넣는다.
  • fd 파일에 이미 내용이 존재한다면 덮어쓰기가 이루어진다.
  • open의 옵션중 O_APPEND 가 설정되었다면 file의 offset은 파일의 끝부분으로 설정된다.

📗 예시 - copy file

int copyfile ( const char *name1, const char *name2){
    int infile, outfile;
    ssize_t nread;
    char buffer[512];

	/*infile 읽기오류*/
    if ( (infile = open (name1, O_RDONLY ) )== -1)
	return(-1);

	/*outfile 읽기오류*/
    if ( (outfile = open (name2, O_WRONLY|O_CREAT|O_TRUNC, 644) )== -1){
        close (infile);
        return (-2);
    }
    
    /* nread값이 0이되면 EOF이라는 뜻, EOF까지 파일을 계속 읽음*/
    while ( (nread = read (infile, buffer, 512) ) > 0){
    	/*infile의 값을 buffer에 복사*/
        /*buffer에 복사된 내용을 다시 outfile에 복사*/
        if ( write(outfile, buffer, nread) < nread ){
	   		close (infile);
	   		close (outfile);
	   		return (-3); //쓰기오류
        }
    }

    close (infile);
    close (outfile);

    if ( nread == -1)  return (-4)	//마지막 읽기오류
    else   return (0); 		//정상처리
}

int main(){
	copyfile("test.in","test.out");
}

✏️lseek(2) system call

#include <unistd.h>

off_t lseek(int fd, off_t offset, int start_flag);

//성공시 새로운 파일의 offset이, 실패시 -1이 반환된다.
  • offset : start_flag을 기준으로하여 더해질 offset값
  • 용도 : read나 write를 원하는 위치에서 시작하기 위하여 사용한다.
  • start_flag

📗 예시 - 위와 아래는 같은 과정이다.

fd = open(test, O_RDWR);
lseek(fd, (off_t)0, SEEK_END);
write(fd, buf, n);
fd = open(test, O_WRONLY|O_APPEND);
write(fd, buf, n);

0개의 댓글

관련 채용 정보