'OS'에 해당되는 글 130건

  1. 2011.12.23 open
  2. 2011.12.23 fcntl 을 이용한 파일제어
  3. 2011.12.08 mktime 날짜를 Unix Time으로 전환
  4. 2011.12.05 unix/linux ftp 명령어
  5. 2011.12.01 유닉스/리눅스 시스템 라이브러리 함수
  6. 2011.12.01 basename, dirname
  7. 2011.11.30 공유 메모리
  8. 2011.11.28 /etc/inittab
  9. 2011.11.24 make 널 확장자 규칙
  10. 2011.11.24 make 확장자 규칙

open

OS/리눅스 & 유닉스 2011. 12. 23. 13:19

1장. open(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

파일이나 장치를 열고 생성한다.


1.1절. 사용법

#include <sys/types.h>

#include <sys/stat.h>
#include <fcntl.h>

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


1.2절. 설명

open(2) 은 시스템호출로, 파일을 열거나 생성 할때 사용한다. 성공하면 해당파일을 지시하는 int 형의 파일지시자를 되돌려준다. path_name 은 생성하고자 하는 파일이름을 나타낸다. 보통 full path 이름을 적어주며, 단지 파일이름만 적을경우에는 현재 경로에 파일이 생성된다.

flag 는 파일을 어떠한 mode 로 열것인지를 결정하기 위해서 사용한다. "읽기전용", "쓰기전용", "읽기/쓰기" 모드로 열수 있다. 이들 모드 선택을 위해서 O_RDONLY, O_WRONLY, O_RDWR 이 존재 한다.

또한 다음중 하나이상의 mode 를 bitwise 연산시킬수도 있다.

O_CREAT

만약 pathname 파일이 존재하지 않을경우 파일을 생성한다.

O_EXCL

O_CREAT 를 이용해서 파일을 생성하고자 할때, 이미 파일이 존재한다면, 에러를 되돌려주며 파일을 생성하는데 실패한다. 이러한 특성때문에 때때로 잠금 파일을 만들기 위해 사용되기도 한다.

O_APPEND

파일이 추가모드로 열린다. 파일의 위치는 파일의 끝이된다.

O_NONBOLOCK, O_NDELAY

파일이 비봉쇄 모드로 열린다.

O_NOFOLLOW

경로명이 심볼릭 링크라면, 파일열기에 실패한다.

O_DIRECTORY

경로명이 디렉토리가 아니라면 파일열기에 실패한다.

O_SYNC

입출력 동기화 모드로 열린다. 모든 write 는 데이타가 물리적인 하드웨어에 기록될때까지 호출 프로세스를 블록시킨다.

또한 mode 를 이용해서 에 파일의 권한을 지정해 줄수도 있다.

S_IRWXU

00700 모드로 파일 소유자에게 읽기, 쓰기, 쓰기 실행권한을 준다.

S_IRUSR

00400 으로 사용자에게 읽기 권한을 준다.

S_IWUSR

00200 으로 사용자에게 쓰기 권한을 준다.

S_IXUSR

00100 으로 사용자에게 실행 권한을 준다.

S_IRWXG

00070 으로 그룹에게 읽기, 쓰기, 실행 권한을 준다.

S_IRGRP

00040 으로 그룹에게 읽기권한을 준다.

S_IWGRP

00020 으로 그룹에게 쓰기권한을 준다.

S_IXGRP

00010 으로 그룹에게 실행권한을 준다.

S_IRWXO

00007 으로 기타 사용자 에게 읽기, 쓰기, 실행 권한을 준다.

S_IROTH

00004 으로 기타 사용자 에게 읽기 권한을 준다.

S_IWOTH

00002 으로 기타 사용자 에게 쓰기 권한을 준다.

S_IXOTH

00001 으로 기타 사용자 에게 실행 권한을 준다.


1.3절. 반환값

에러가 발생하면 -1 을 반환하며, 성공했을경우에는 새로운 파일 지시자를 반환한다. 에러시에는 적당한 errno 값이 설정된다.


1.4절. 에러

EEXIST

O_CREAT 와 O_EXECL 이 같이 사용되었을경우 발생한다. 이미 경로파일이 존재할경우 발생된다.

EACCES

파일 접근이 거부될경우이다. 주로 권한 문제 때문에 발생한다.

ENOENT

경로명의 디렉토리가 없거나, 심볼릭 링크가 깨져있을때.

ENOENT

경로명의 디렉토리가 없거나, 심볼릭 링크가 깨져있을때.

ENODEV

경로명이 장치파일을 참고하고, 일치하는 장치가 없을때.

EROFS

경로명이 read-only 파일시스템을 참조하면서, 쓰기로 열려고 할때.

EROFS

경로명이 read-only 파일시스템을 참조하면서, 쓰기로 열려고 할때.

EFAULT

경로명이 접근할수 없는 주소강간을 가르킬때

ELOOP

심볼릭 링크가 너무 많을때.


1.5절. 예제

// /usr/my.temp 파일을 읽기 전용으로 열고자 할때
fd = open("/usr/my.temp", O_RDONLY);
...

close(fd);

// 파일을 쓰기 전용으로 생성하며, 파일의 권한은 644 로 한다. 
// 만약 이미 파일이 존재한다면 에러가 발생할것이다.
fd = open("/usr/my.temp", O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); 
...
close(fd);
		


'OS > 리눅스 & 유닉스' 카테고리의 다른 글

write  (0) 2011.12.23
read  (0) 2011.12.23
fcntl 을 이용한 파일제어  (0) 2011.12.23
mktime 날짜를 Unix Time으로 전환  (0) 2011.12.08
unix/linux ftp 명령어  (0) 2011.12.05
:

fcntl 을 이용한 파일제어

OS/리눅스 & 유닉스 2011. 12. 23. 13:18

1절. 소개

유닉스의 모든것은 파일로 이루어져 있다는 사실은 아마도 잘알고 있을 것이다. 그러므로 유능한? 유닉스 프로그래머로 성장하기 위해서는 파일관련된 여러가지 작업들을 능숙하게 처리할수 있어야한다. 실제로 유닉스 프로그램을 하게 되면 가장 많이 하는 작업이 파일과 연관된 작업이다.

일반 파일은 물론이고, 네트웍 프로그래밍시 소켓을 다룰때, IPC, 디바이스등을 다루는 모든 것이 결국은 파일을 다루는 것들이다.

fcntl 은 이러한 파일들의 특성 제어를 위해 제공하는 함수이다.


2절. fcntl 을 이용한 파일제어

fcntl 시스템호출은 이미 열려있는 파일의 특성 제어를 위해서 사용된다.

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

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
		

첫번째 인자로 주어지는 fd 는 open(2), socket(2) 등의 시스템 호출을 통해서 만들어진 파일 지정자이다. 두번째 인자인 cmd 가 fd 에 대한 특성을 제어하기위한 값이다.


2.1절. fcntl 로 할수 있는 일들

fcntl 로 할수 있는 일들은 결국 cmd 에 의해서 결정된다고 볼수 있다. 대략적으로 할수 있는 일들은 다음과 같다. 할수 있는 일은 cmd 에 의해서 결정됨으로 cmd 별로 설명을 했다.

F_DUPFD

이름에서 주는 어감처럼 열려진 파일지정자를 복사하기 위해서 사용한다. 언뜻보면 dup2(2) 함수와 매우 비슷한데, dup2 는 복사될 파일지정자를 사용자가 지시하는 반면, F_DUPFD 를 사용할경우 arg 와 같은 크기의 파일지정자를 되돌려주거나, 이미 사용되어지고 있다면, arg 보다 큰 할당가능한 파일지정번호중 가장 작은 번호를 되돌려준다.

이 복사된 파일지정번호는 잠금, 파일위치 포인터, 플레그 등을 공유한다. 즉 파일지정자들중 하나에서 파일의 위치가 변경된다면(lseek등을 이용), 다른 파일지정자도 변경된다.

그렇지만 close-on-exec 는 공유하지 않는다. close-on-exec 는 다음장에서 다루도록 하겠다.

F_GETFD

리턴값으로 fd 에 대한 flag 값을 넘겨준다. 현재는 FD_CLOEXEC 정보만 넘겨준다. FD_CLOEXEC 는 close-on-exec 정책에 관한 내용으로 다음장에서 다루도록 하겠다.

F_SETFD

FD_CLOEXEC(close-on-exec) 의 값을 지정된 비트값으로 설정한다.

F_GETFL

파일지정자에 대한 플래그값 - open(2) 호출시 지정한 플래그를 되돌려준다.

F_SETFL

arg 에 지정된 값으로 파일지정자 fd 의 플래그를 재 설정한다. 현재는 단지 O_APPEND, O_NONBLOCK, O_ASYNC 만을 설정할수 있다. 다른 플래그들 (O_WRONLY 와 같은) 은 영향을 받지 않는다.

F_GETOWN

이것은 비동기 입출력과 관련되어서 사용되며, SIGIO와 SIGURG 신호를 받는 프로세스 아이디를 얻기 위해서 사용된다.

F_SETOWN

비동기 입출력과 관련되어서 사용되며, SIGIO, SIGURG 시그널을 수신하는 프로세스 아이디(혹은 그룹)을 설정하기 위해서 사용된다.

이외에도 F_SETLK, F_SETLKW, F_SETLK 와 같은 레코드 잠금에 대한 설정도 가능하다. 이 내용들은 fcntl 레코드잠금에서 다루고 있음으로 여기에서 설명하진 않겠다. (또한 이문서의 내용은 파일단위의 특성 조작이므로 레코드단위의 특성조작은 이 문서의 내용과 다른분야이다.)


2.2절. close-on-exec 에 대해서

fcntl의 특성제어를 다루기 전에 close-on-exec에 대해서 간단히 알아보도록 하겠다.

보통 프로세스에서 exec(3) 를 시켜서 새로운 프로세스를 실행시키면 이 새로운 프로세스는 기존의 프로세스의 이미지를 덮어쓰게 된다. 그러면서 특별한 설정이 없을경우 열린파일지정자를 그대로 넘겨주게 된다. 다음 예제를 open-on-exec.c 로 저장하도록 하자.

예제 : open-on-exec.c

#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;
    int val;
    fd = open("exec_copy.txt", O_CREAT);

    execl("/home/my_cvs/test/c_source/loop", "./loop", 0);
}
			
execl 로 실행시키는 loop 프로그램은 그냥 무한루프 도는 프로그램 이니 각자 만들기 바란다.

위 프로그램을 실행시킨후 ps 를 확인하고 /proc/pid/fd 로 이동해서 ls 를 해보면

[root@coco fd]# ls -al
합계 0
dr-x------    2 root     root            0 10월 25 13:59 .
dr-xr-xr-x    3 root     root            0 10월 25 13:59 ..
lrwx------    1 root     root           64 10월 25 13:59 0 -> /dev/ttyp0
lrwx------    1 root     root           64 10월 25 13:59 1 -> /dev/ttyp0
lrwx------    1 root     root           64 10월 25 13:59 2 -> /dev/ttyp0
lr-x------    1 root     root           64 10월 25 13:59 3 -> /home/mycvs/test/exec_copy.txt
			
exec 하면서 열린파일지정자가 상속되었음을 알수 있다.

그러나 때때로 exec 를 이용해서 프로세스를 만들기전에 기존에 열렸던 파일지정자들을 깨끗하게 정리하고 싶을때가 있을것이다. 이러한 경우를 close-on-exec 시킨다라고 말하며, fcntl 을 이용해서 열린 파일지정자에 대해서 close-on-exec 작동을 하도록 할수 있다. 위의 open-on-exec.c 를 close-on-exec 버젼으로 바꾸는 방법은 2.3.2절에서 설명하도록 하겠다.


2.3절. 파일특성조작 하기

2.3.1절. F_DUPFD

위에서 설명을 이미 했음으로 간단한 예제로 이해를 돕는 수준에서 끝내도록 하겠다.

예제 : f_dupfd.c

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

int main()
{
    int testfd;
    int fd;

    fd  = open("test.txt", O_CREAT);

    testfd = fcntl(fd, F_DUPFD, 10);
    printf("testfd :%d\n", testfd);
    testfd = fcntl(fd, F_DUPFD, 10);
    printf("testfd :%d\n", testfd);

    getchar();
}
				
위의 프로그램을 실행시켜보면 testfd 로 각각 4, 5 가 아닌 (0, 1, 2 는 표준 입력/출력/에러, 3 은 test.txt) 10, 11 로 파일지정번호가 지정됨을 알수 있을것이다.


2.3.2절. F_SETFD/F_GETFD

close-on-exec 값을 조정하기 위해서 사용된다. F_GETFD 를 이용해서 FD_CLOEXEC 값을 가져오고 F_SETFD 를 이용해서 이 값을 변경한다. 기본적으로는 exec 할때 close 되지 않는다. 그럼 f_dupfd.c 를 close-on-exec 하도록 약간 변경 해보도록 하자.

예제 : close-on-exec

#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;
    int val;
    fd = open("exec_copy.txt", O_CREAT);

    // FD_CLOEXEC 값을 fcntl 을 이용해서 
    // 가져온 다음 세팅되어 있는지 검사한다.  
    val = fcntl(fd, F_GETFD, 0);
    if (val & FD_CLOEXEC)
        printf("close-on-exec bit on\n");
    else
        printf("close-on-exec bit off\n");


    // FD_CLOEXEC 를 세팅한다. 
    val |= FD_CLOEXEC;
    if (val & FD_CLOEXEC)
        printf("close-on-exec bit on\n");
    else
        printf("close-on-exec bit off\n");
    fcntl(fd, F_SETFD, val);

    // loop 프로그램을 exec 시킨다.  
    execl("/home/my_cvs/test/c_source/loop", "./loop", 0);
}
				
위의 프로그램을 실행하면 아래와 같은 실행 결과를 보여줄것이다.
[root@localhost c_source]# ./close-on-exec 
close-on-exec bit off
close-on-exec bit on
				
위의 프로그램을 실행시켜둔 상태에서 과연 fd 가 close-on-exec 되었는지 /proc/pid/fd 를 확인해보면 기존에 열려있던 fd 가 상속되어있지 않음을 확인할수 있을것이다.


2.3.3절. F_GETFL/F_SETFL

F_GETFL 을 open(2)등에 의해서 열려진 파일지정자 에 대한 플레그 값을 읽어온다. 그리고 F_SETFL 에 의해서 파일지정자에 대한 값(특성)을 세팅한다.

F_SETFL 을 이용해서 변경할수 있는 파일지정자의 특성은 O_APPEND, O_NONBLOCK, O_ASYNC 등이다. O_RDONLY, O_WRONLY, O_RDWR 등의 정보는 읽어올수는 있지만 변경할수는 없다.

우선 읽기권한 정보를 읽어오는 것은 O_ACCMODE 와 비트연산을 함으로써 가져올수 있다. 그밖에 정보는 각각의 플레그(O_APPEND, O_NONBLOCK, O_ASYNC) 등과 비트연산을 함으로써 얻어올수 있다.

예제 : fgetfl_test.c

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int mode, fd, value;

    fd = open("test.sh", O_RDONLY|O_CREAT);
    if (fd < 0)
    {
        perror("open error : ");
        exit(0);
    }

    value = fcntl(fd, F_GETFL, 0);

    mode = value & O_ACCMODE;
    if (mode == O_RDONLY)
        printf("O_RDONLY setting\n");
    else if (mode == O_WRONLY)
        printf("O_WRONLY setting\n");
    else if (mode == O_RDWR)
        printf("O_RDWR setting\n");

    if (value & O_NONBLOCK)
        printf("O_NONBLOCK setting\n");
    else
        printf("BLOCKING mode setting\n");
    if (value & O_ASYNC)
        printf("O_ASYNC setting\n");

}
				
이 프로그램을 실행시키면 다음과 같은 결과를 보여줄것이다.
[root@localhost c_source]# ./fgetfl_test
O_RDONLY setting
BLOCKING mode setting
				
최초 open 시의 파일 플레그 값을 읽어오고 있음을 알수 있다.

특성을 변경할수 있는 3개의 경우 단순히 비트연산을 해서 해당 flag 를 킨다음에 그값을 fcntl 을 이용해서 파일지정자에 세팅해주면 된다. 다음 예제는 표준입력(0) 을 NONBLOCK 모드로 변경 시킨 예이다.

fsetfl_test.c

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#define STDIN 0 
int main()
{
    int mode, fd, value;
    char buf[255];

    memset(buf, 0x00, 255);

    // 처음 입력은 봉쇄모드로
    read (STDIN, buf, 255);
    printf("-> %s\n", buf);
    memset(buf, 0x00, 255);

    // NONBLOCKING 모드로 변경한다. 
    value = fcntl(STDIN, F_GETFL, 0);
    value |= O_NONBLOCK;
    fcntl(STDIN, F_SETFL, value);
    printf("NON BLOCKING MODE 로 변경 \n");

    // 2초후 비봉쇄 모드로 들어간다.
    sleep(2);

    // 바쁜대기(busy wait) 시작
    while(1)
    {
        read (STDIN, buf, 255);
        printf("-> %s\n", buf);
    }
}
				
기본적으로 표준입력(0) 은 봉쇄모드로 시작된다. 이것을 fcntl 을 이용해서 비봉쇄 모드로 만들고 테스트한것이다. 위의 프로그램을 실행하면 처음 입력은 봉쇄모드로 사용자 입력이 있을때까지 기다리고, 그 후에는 비봉쇄 모드로 바쁜 상태에서 사용자 입력을 처리하는것을 볼수 있을것이다.

O_ASYNC 와 O_APPEND 역시 동일한 방법으로 처리가능하다.

O_APPEND 는 대충 어떠한 특성변경을 위해서 사용하는지 알것이다. O_ASYNC 에 대해서는 별로 익숙하지 않을수도 있는데, 유닉스 I/O 모델중 흔히 말하는 "비동기 입출력" 모델을 구현하기 위해서 사용된다. 비동기는 언제 일어날지 알수 없는 사건을 말하며, 유닉스에서는 이러한 비동기 사건을 알려주기 위해서 시그널(signal)을 사용한다. 유닉스의 I/O 모델의 종류는 리눅스 I/O 모델 을 참고하기 바란다.

이 문서에서는 비동기 입력출방법 자체에 대한 내용은 다루지 않을것이다. 이것은 리눅스 I/O 모델의 또다른 구현임으로 리눅스 I/O 모델 관련 문서를 다루면서 언급할것이다. (현재는 Blocking I/O, Non-Blocking I/O, I/O Multiplexing 까지를 다룬 문서들이 제공되고 있다) 다루고 있다)


2.3.4절. F_GETOWN/F_SETOWN

바로 윗장에서 우리는 F_GETFL/F_SETFL 을 이용해서 파일지정자의 특성을 변경하는 법을 배웠었다. 그중에서 비동기 입출력 설정을 위한 O_ASYNC 플레그를 설정하는 방법을 배웠었는데, F_GETOWN/F_SETOWN 은 이 비동기 입출력과 관련되어서 사용되는 플래그이다.

이들 플레그를 사용함으로써 비동기 입출력 모드로 파일지정자가 설정되어 있을때, 어떤 프로세스(혹은 그룹) 아이디로 부터 오는 시그널을 받을지를 지정해줄수 있다. 역시 자세한 내용은 리눅스 I/O 모델 문서에서 다루도록 하겠다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

read  (0) 2011.12.23
open  (0) 2011.12.23
mktime 날짜를 Unix Time으로 전환  (0) 2011.12.08
unix/linux ftp 명령어  (0) 2011.12.05
유닉스/리눅스 시스템 라이브러리 함수  (0) 2011.12.01
:

mktime 날짜를 Unix Time으로 전환

OS/리눅스 & 유닉스 2011. 12. 8. 11:13

mktime

Unix Time 시간을 가져온다.

 

사용법

 #include <time.h> 
 
time_t mktime(struct tm *tm);

 

설명

mktime 함수는 인자로 받은 시간 구조체 tlmeptr의 값을 Unix Time 시간으로 변경시킨다.

 

struct tm 구조체의 원형은

 struct tm { 
    int tm_sec;          /* seconds */ 
    int tm_min;          /* minutes */ 
    int tm_hour;        /* hours */ 
    int tm_mday;       /* day of the month */ 
    int tm_mon;         /* month */ 
    int tm_year;        /* year */ 
    int tm_wday;       /* day of the week */ 
    int tm_yday;       /* day in the year */ 
    int tm_isdst;       /* daylight saving time */ 
};

 

tm 구조체의 멤버변수에 대한 설명이다.

 tm_sec : 0 - 59 까지의 초 
 tm_min : 0 - 59 까지의 분
 tm_hour : 0 - 23 까지의 시
 tm_mday : 1 - 31 까지의 일
 tm_mon : 0 - 11 까지의 월
 tm_year : 년도로 1900년이 시작 년으로 한다.
 tm_wday : 일요일 부터의 일 , 0 - 6 
 tm_yday : 1월 1일 부터의 일, 0 - 365
 tm_isdst : 일광절약 시간을 적용할 것인지.

* 월과 년도를 정할 때 주의!!

예를 들어, 2010년 6월이라면

tm_year = (2010 - 1990)

tm_mon = (6 - 1)

 

예제

 #include <time.h> 
 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
 
int main() 

    struct tm tm_ptr; 
    time_t the_time; 
    int i; 
 
    // 2010년 6월 18일 1시 20분 30초 에 대한 
    // Unix Time 를 되돌려준다. 
    tm_ptr.tm_year = 110;  // 2010 - 1900 
    tm_ptr.tm_mon  = 5;    // 5 - 1 
    tm_ptr.tm_mday = 18; 
    tm_ptr.tm_hour = 1; 
    tm_ptr.tm_min  = 20; 
    tm_ptr.tm_sec  = 30; 
 
    printf("%d\n", mktime(&tm_ptr)); 
}

[출처] mktime|작성자 사랑이송송

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

open  (0) 2011.12.23
fcntl 을 이용한 파일제어  (0) 2011.12.23
unix/linux ftp 명령어  (0) 2011.12.05
유닉스/리눅스 시스템 라이브러리 함수  (0) 2011.12.01
basename, dirname  (0) 2011.12.01
:

unix/linux ftp 명령어

OS/리눅스 & 유닉스 2011. 12. 5. 14:49

참고로 ftp를 사용하는 컴퓨터를 host1, 원격지에 있는 컴퓨터를 host2라고 명명한다.

 

ls

host2의 현재 디렉토리에 있는 파일리스트가 출력된다.

dir

host2의 현재 디렉토리에 있는 파일리스트가 자세히 출력된다. ls -l과 동일

cd

host2의 작업 디렉토리를 이동한다.

lcd

host1의 작업 디렉토리를 이동한다.

ascii

파일 전송 모드를 ascii로 지정한다.

bin

파일 전송 모드를 binary로 지정한다.

get

host2에 있는 파일을 host1으로 전송한다.

mget

host2에 있는 파일들을 host1으로 전송한다.

put

host1에 있는 파일을 host2로 전송한다.

mput

host1에 있는 파일들을 host2로 전송한다.

?

ftp에서 사용할 수 있는 명령어 목록을 보여준다.

byte

ftp 연결을 끊고 ftp 프로그램을 종료한다.

[출처] [Linux/Unix]ftp 명령어|작성자 bestheroz

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

fcntl 을 이용한 파일제어  (0) 2011.12.23
mktime 날짜를 Unix Time으로 전환  (0) 2011.12.08
유닉스/리눅스 시스템 라이브러리 함수  (0) 2011.12.01
basename, dirname  (0) 2011.12.01
공유 메모리  (0) 2011.11.30
:

유닉스/리눅스 시스템 라이브러리 함수

OS/리눅스 & 유닉스 2011. 12. 1. 19:49

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

mktime 날짜를 Unix Time으로 전환  (0) 2011.12.08
unix/linux ftp 명령어  (0) 2011.12.05
basename, dirname  (0) 2011.12.01
공유 메모리  (0) 2011.11.30
/etc/inittab  (0) 2011.11.28
:

basename, dirname

OS/리눅스 & 유닉스 2011. 12. 1. 10:04
basename --help
 Usage: basename NAME [SUFFIX]
  or:  basename OPTION
Print NAME with any leading directory components removed.
If specified, also remove a trailing SUFFIX.
 
      --help     이 도움말을 표시하고 끝냅니다
      --version  버전 정보를 출력하고 끝냅니다
 
Examples:
  basename /usr/bin/sort       Output "sort".
  basename include/stdio.h .h  Output "stdio".
 
파일명에서 경로 정보를 떼어내고 오직 파일 이름만 보여 줍니다. basename $0 이라고 하면 스크립트는 자기가 쉘에서 불린 자기 이름을 알 수 있습니다. 스크립트에 필요한 인자가 없이 실행되는 경우에 "사용법" 메세지를 찍을 때 쓸 수 있습니다. 
 
 
dirname --help
 Usage: dirname NAME
  or:  dirname OPTION
Print NAME with its trailing /component removed; if NAME contains no /'s,
output `.' (meaning the current directory).
 
      --help     이 도움말을 표시하고 끝냅니다
      --version  버전 정보를 출력하고 끝냅니다
 
Examples:
  dirname /usr/bin/sort  Output "/usr/bin".
  dirname stdio.h        Output ".".
 
파일명에서 basename을 떼어내고 오직 경로 정보만 보여줍니다.
참고: basename과 dirname은 어떤 문자열에 대해서도 동작합니다. 이 명령어들에 넘겨줄 인자는 꼭 실제로 존재하는 파일이 아니여도 됩니다
 
ex)
#!/bin/bash
tmp=/usr/local/src/httpd-2.2.11.tar.gz
echo "basename = `basename $a`"
echo "dirname = `dirname $a`"
exit 0
 
 
 
### 실행결과 ###
basename = httpd-2.2.11.tar.gz
dirname = /usr/local/src
 

[출처] basename 과 dirname|작성자 모지리

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

unix/linux ftp 명령어  (0) 2011.12.05
유닉스/리눅스 시스템 라이브러리 함수  (0) 2011.12.01
공유 메모리  (0) 2011.11.30
/etc/inittab  (0) 2011.11.28
make 널 확장자 규칙  (0) 2011.11.24
:

공유 메모리

OS/리눅스 & 유닉스 2011. 11. 30. 17:13

1장. shmget(2)

공유메모리 영역을 할당한다.


1.1. 사용법

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);
		


1.2. 설명

shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널에 요청한다. 커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유메모리를 가르키는 식별자를 리턴하게 된다. 생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다. 공간의 할당은shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나, IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.

다음은 사용가능한 shmflg값들이다.

IPC_CREAT

새로운 영역을 할당한다. 만약 이 값이 사용되지 않았다면, shmget()은 key로 이미 생성된 접근 가능한 공유메모리 영역이 있는지 확인하고 이에 대한 식별자를 되돌려줄 것이다.

IPC_EXCL

IPC_CREAT와 함께 사용하며 공유메모리 영역이 이미 존재하면 에러를 리턴한다.

mode_flags(하위 9bit)

접근 권한의 지정을 위해서 사용한다. 실행권한은 사용하지 않는다.

만약 새로운 영역이 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가 정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다. shmid_ds 구조체는 아래와 같이 정의되어 있다.

struct shmid_ds {
    struct ipc_perm shm_perm;    /* operation perms */
    int             shm_segsz;   /* size of segment (bytes) */
    time_t          shm_atime;   /* last attach time */
    time_t          shm_dtime;   /* last detach time */
    time_t          shm_ctime;   /* last change time */
    unsigned short  shm_cpid;    /* pid of creator */
    unsigned short  shm_lpid;    /* pid of last operator */
    short           shm_nattch;  /* no. of current attaches */
};

struct ipc_perm {
    key_t  key;
    ushort uid;   /* owner euid and egid */
    ushort gid;
    ushort cuid;  /* creator euid and egid */
    ushort cgid;
    ushort mode;  /* lower 9 bits of shmflg */
    ushort seq;   /* sequence number */
};
		
만약 공유 메모리 영역이 이미 존재한다면 접근권한은 수정된다.


1.3. 시스템 호출에 대한 반응

fork()

attache된 공유 메모리 공간은 자식 프로세스에게 상속된다.

exec()

exec()가 호출된 후에는 모든 공유 메모리 공간은 detache된다.

exit()

exit()후 모든 공유 메모리 공간은 detache된다 (없어 지지는 않는다).


1.4. 반환값

성공하면 shmid를 반환, 실패하면 -1을 반환한다.


1.5. 에러

EINVAL

공유 영역생성시 너무 작은 공간을 할당 하거나(size < SHMMIN) 너무 큰 공간(size > SHMMAX)을 할당했을 경우

EEXIST

EACCESS

IPC_CREAT | IPC_EXCL 로 생성을 요청했는데, 이미 공유 메모리 영역이 존재하고 있을 경우,

ENOSPC

size만큼의 공간을 할당할 수 없을 경우. 사용가능한 공간은 SHMALL값으로 커널전역적으로 정의되어 있다. (/usr/include/linux/shm.h 참고)

ENOENT

IPC_CREAT를 사용하지 않았는데, 해당 key를 가지는 공유 메모리 영역이 존재 하지 않는 경우

EACCESS

공유 메모리 영역에 대한 접근권한이 주어져 있지 않다.

ENOMEM

이용할 수 있는 커널 메모리가 충분하지 않다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

유닉스/리눅스 시스템 라이브러리 함수  (0) 2011.12.01
basename, dirname  (0) 2011.12.01
/etc/inittab  (0) 2011.11.28
make 널 확장자 규칙  (0) 2011.11.24
make 확장자 규칙  (0) 2011.11.24
:

/etc/inittab

OS/리눅스 & 유닉스 2011. 11. 28. 10:15
/etc/inittab 파일의 각각의 행들은 모두 다음과 같은 형식으로 작성되어있다.

 

형식 : name : level-number : options : process -options

 

 항     목

의        미 

 name

 id, si, pr 등의 값들이 올 수 있다.

 level-number

 이 행의 실행내용을 어떤 실행레벨(부팅레벨)에서 실행할 것인가를 설정한 것이다. 이행의 설정내용을 실행시킬 부팅레벨을 결정한 것이다. '3'은 3번 부팅레벨, '35'는 3번과 5번 부팅레벨을 모두 의미한다. '2345'는 2번, 3번, 4번, 5번 부팅레벨을 모두 의미한다.

 options

 그 다음 네번째항목에 나오는 프로세스(명령어)를 실행할 때에 적용되는 특수한 속성들이다. 이 속성에 따라서 이 행의 실행성격이 결정된다. 이 속성들에 대한 자세한 설명을 이어서 하고 있다.

 process -options

 실행할 프로세스(명령어)와 명령어에 대한 옵션이다.

 

 

options 항목의 속성

 

respawn 속성

프로세스가 종료될때마다 다시 자동으로 재실행한다.

 

 

가상콘솔로 로그인한 후에 로그아웃하면 자동으로 다시 로그인창이 뜨는 이유가 바로 respawn이라는 속성때문이다.

 

wait속성

지정된 프로세스가 실행되면 init은 프로세스가 종료될 때까지 기다린 후에 다음 작업으로 넘어가도록 하는 옵션이다.

 

one 속성

해당 프로세스를 한번만 실행되도록 하는 옵션이다.

 

boot 속성

시스템이 부팅되는 동안 해당 프로세스가 실행되면, init은 실행레벨필드를 무시한다.

 

bootwait 속성

시스템이 부팅되는 동안 해당 프로세스가 실행되면, init은 프로세스가 종료될 때까지 기다린다.

 

off 속성

아무런 동작도 발생하지 않도록 하는 옵션이다. 설정라인을 지우지 않고 그 내용이 실행되지 않도록 할 때 사용한다. 일종의 주석처리행이라고 할 수 있으며 off 대신 그행의 맨 앞에 #를 붙여서 주석처리할 수도 있다.

 

ondemand 속성

실행레벨이 1,2,3인 경우에만 유용하다. init은 이 세개의 실행레벨과 함께 호출될 때만 프로세스가 작동한다. 잘사용하지 않는 옵션이다.

 

initdefault 속성

시스템이 부팅되면서 어떤 실행레벨로 부팅할 것이낙를 결정하는 옵션이다. 즉 시스템의 실행레벨을 결정하는 옵션으로서 /etc/inittab 파일의 맨 처음 실행내용인 시스템 부팅레벨을 결정하는 다음 설정행에서 이 속성에서 볼 수 있다.

위의 설정에 의하면 이 시스템은 5번 부팅레벨로 부팅이 진행될 것이다.

 

sysinit 속성

시스템이 부팅되는 동안 해당프로세스를 한번만 실행하는 옵션이다. sysinit은 boot나 bootwait 보다 우선권을 가진다.

모든 부팅레벨에서 단 한번만 실행되는 내용이 바로 /etc/rc.d/rc.sysinit 스크립트 파일의 내용이다.

 

powerwait 속성

init은 SIGPWR 신호를 받는 경우에만 프로세스가 가동된다. 전원에 문제가 있을 때 보통 UPS의 전원모니터링 소프트웨어가 이를 인식하여 init에게 신호를 해준다. 이경우 init은 프로세스가 종료될 때까지 기다린다.

 

powerfail 속성

powerwait와 같지만 init은 프로세스가 완결될 때까지 기다리지 않는다.

위의 설정으로 인하여 전원이 부족하게 되면 해당프로세스가 실행되어 시스템은 종료절차를 밟게 된다.

 

powerokwait 속성

init가 SIGPWR신호를 받고 /etc/powerstatus라는 텍스트 파일에 OK라는 문자열이 있을 때 프로세스가 실행된다. 일반적으로 UPS 모니터링 프로그램이 이 파일을 생성하며 SIGPWR 신호를 init에게 보내어 전원상의 문제가 해결되었음을 알려준다.

 

ctrlaltdel 속성

이 옵션은 init 프로세스가 SIGINT 신호를 받았을 때에 실행되도록 한다.

 

kbrequest 속성

init 프로세스가 키보드관리자로 부터 keyboardsignal을 받았을 때에 해당 프로세스를 실행되도록 한다.

[출처] /etc/inittab|작성자 oracleguy

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

basename, dirname  (0) 2011.12.01
공유 메모리  (0) 2011.11.30
make 널 확장자 규칙  (0) 2011.11.24
make 확장자 규칙  (0) 2011.11.24
make 관련 한글 메뉴얼 사이트  (0) 2011.11.24
:

make 널 확장자 규칙

OS/리눅스 & 유닉스 2011. 11. 24. 20:02
확장자 규칙
미리 정의해 놓은 일반화한 항목. 
간단히 말해서 파일의 확장자를 보고 그에 따라 적절한 연산을 수행시키는 규칙이라고 말할 수 있다. 가령 .c 파일은 일반적으로 C 소스 코드를 가리키며 .o 파일은 목적 파일을 말한다. 그리고 당연히 .c 파일이 컴파일되면 .o 파일이 만들어져야 한다. 

필요 항목이 몇몇 확장자 가운데 하나를 갖거나 사용자가 제공한 그 어떤 명시적인 명령도 가지고 있지 않을 경우, make는 적절한 확장자 규칙을 찾게 된다. 즉, program이 만들어지기 전에 필요 항목 리스트 가운데 어떤 항목이 먼저 만들어져야 하는지 확인한다.

.SUFFIXES : .c .o .s
.SUFFIXES 행은 make가 주의 깊게 처리할 파일들의 확장자를 등록해 준다고 이해하면 된다(중요하게 여길 확장자를 나타낸다).
위의 표현은 .c와 .o 그리고 .s 확장자를 가진 파일들을 확장자 규칙에 의거해서 처리될 수 있도록 해준다. 

.c :
    $(CC) $(CFLAGS) $< -o $@
.c 확장자의 파일로부터 널 확장자의 파일(실행 프로그램)을 만드는 방법을 설명한다(널 확장자가 .c와 콜론 사이에 있다고 생각). 이 규칙은 하나의 소스 파일에서 작성할 때 오브젝트 파일을 다루지 않도록 해준다.


.c.o :
    $(CC) $(CFLAGS) -c $<
이 규칙은 .c에서 .o파일을 만드는 방법을 설명하고 있다.

OBJS = main.o iodat.o dorun.o lo.o
LIB = /usr/proj/lib/crtn.a

program : ${OBJS} ${LIB}
    ${CC} -o $@ ${OBJS} ${LIB}
$ make program                    --> cc -o program main.o iodat.o dorun.o io.o /usr/proj/crtn.a

어떤 확장자에 대해 확장자 규칙이 정의되어 있더라도 .SUFFIXES 리스트에도 함께 정의되어야 효력이 있다. 
make는 .SUFFIXES 리스트의 확장자 순서에 따라 파일을 검색한다.
make는 현재의 작성에서 사용한 모든 변수와 확장자 규칙, 그리고 target을 출력하는 유용한 -p 옵션을 제공한다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

공유 메모리  (0) 2011.11.30
/etc/inittab  (0) 2011.11.28
make 확장자 규칙  (0) 2011.11.24
make 관련 한글 메뉴얼 사이트  (0) 2011.11.24
dbx 명령  (0) 2011.11.24
:

make 확장자 규칙

OS/리눅스 & 유닉스 2011. 11. 24. 17:26

확장자 규칙은 확장자가 같은 여러개의 파일에 똑같은 규칙을 적용하고 싶을 때 
유용하게 쓰이는 방법입니다.

어떤 프로젝트에 c 파일이 여러개 있다고 가정해봅시다. 그리고 이것을 컴파일 하는
다음과 같은 makefile이 있다고 생각해봅시다.

그냥 Makefile)
example : main.o read.o write.o handle.o
 gcc -o example main.o read.o write.o handle.o

main.o : main.c 
 gcc -c main.c -o main.o
read.o : read.c
 gcc -c read.c -o read.o
write.o : write.c
 gcc -c write.c -o write.o
handle.o : handle.c
 gcc -c handle.c -o handle.o


이 Makefile을 이용해 쉘에서 make example명령을 내리면 example라는 실행파일이 생기겠죠?
그런데, 가만히 보니 밑의 object파일을 만들어주는 부분은 파일이름만 다르고
다 동일한 모양을 하고 있습니다. 그렇습니다. 프로그래머라는 사람들은 이런 귀찮은
짓을 그냥 놔둘리가 없습니다.

다음은 확장자 규칙을 이용하여 다시 만들어본 Makefile 예제입니다.

확장자 규칙을 이용한 향상된 Makefile)
.SUFFIXES : .c .o

example : make.o read.o write.o handle.o
 gcc -o example make.o read.o write.o handle.o

.c.o :
 gcc -c $< -o $@

main.o : main.c 
read.o : read.c
write.o : write.c
handle.o : handle.c

새로 추가된 부분을 설명해보겠습니다.

.SUFFIXES : .c .o 
이 부분은 .c와 .o 확장자를 가진 파일들에 대해서 특별히 처리할 것이다 라는 것을 알려주는 부분입니다.  별로 신경쓸 것 없습니다.  그냥 그런가보다 하면 됩니다.

.c.o :
 gcc -c $< -o $@

바로 이곳이 문제의 핵심입니다.  이게 무슨 소리냐 하면, .c 파일을 이용해서 .o 파일을 만들 수 있고, 아랫줄에 있는 명령을 이용해서 만든다는 얘기입니다. 즉 어떤 .o 파일이 필요할 경우 이 규칙에 의해서 해당 .c파일을 찾고 아랫줄의 명령을 실행시켜서 .o파일을 생성해 내는 것입니다.
 아래 명령(gcc -c $< -o $@)을 잠깐 설명하면, 목표파일(.o)보다 소스파일(.c)이 더 최근에 갱신된 모든 파일($<)을 컴파일해서 목표파일($@)을 만든다고 되어있습니다.

이제 make example라는 명령을 입력하면 무슨 일이 벌어지는지 이해하실 수 있을 것입니다.
example를 만들려면 make.o read.o write.o handle.o 가 있어야되고,  .c.o 확장자 규칙에 의해 make.o는 make.c를, read.o는 read.c를, write.o는 write.c를, handle.o는 handle.c를 이용하여 만들어 집니다.  목표 파일(.o)들이 확장자 규칙(.c.o)에 의해 다 만들어지면 이 목표파일들을 이용하여 마지막으로 example라는 실행파일을 생성합니다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

/etc/inittab  (0) 2011.11.28
make 널 확장자 규칙  (0) 2011.11.24
make 관련 한글 메뉴얼 사이트  (0) 2011.11.24
dbx 명령  (0) 2011.11.24
find 03  (0) 2011.11.24
: