태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

지니넷

'개발'에 해당되는 글 178건

  1. 2009.09.02 UDP socket function flow
  2. 2009.08.24 특수 매개 변수
  3. 2009.06.08 proc 파일 시스템 동작 방식
  4. 2009.06.08 파일 타입, 접근 허가 상수
  5. 2008.07.30 함수
  6. 2008.07.28 데몬 프로세스
  7. 2008.07.28 ABI
  8. 2008.05.19 semaphore
  9. 2008.05.19 mmap
  10. 2008.05.19 SysV IPC vs. POSIX IPC

UDP socket function flow

2009.09.02 17:01 : 개발






저작자 표시
신고
Posted by 지니넷 Trackback 0 Comment 0

특수 매개 변수

2009.08.24 11:38 : 개발

◆ $-

스크립트로 넘겨진 플래그들

◆ $!

백그라운드로 돌고 있는 가장 최근 작업의 PID

◆ $_

바로 이전에 실행된 명령어의 제일 마지막 인자로 설정되는 특수 변수

◆ $?

명령어나 함수, 스크립트 자신의 종료 상태

◆ $$

스크립트 자신의 프로세스 아이디로 보통 임시 파일 이름을 만들 때 사용







저작자 표시
신고
Posted by 지니넷 Trackback 0 Comment 0
shell에서 명령을 이용하거나 app에서 파일 처리 함수로 proc 파일에 접근하면, 커널은 proc_dir_entry 구조체 변수의 정보를 이용해 proc 파일을 생성한 디바이스 드라이버가 제공하는 함수를 호출한다.
app에서 proc 파일에 쓰기를 하면 proc_dir_entry 구조체 필드의 write_proc 필드에 지정된 함수가 호출되고, 이 함수는 app에서 써넣어진 데이터를 처리해야 한다.
반대로 app에서 proc 파일에 읽기를 수행하면 proc_dir_entry 구조체 필드의 read_proc 필드에 지정된 합수가 호출되고, 이 함수는 app에서 읽을 데이터를 제공해야 한다.
◇ proc 파일 시스템은 일반 파일 시스템처럼 처리가 가능하고, 대부분의 디바이스 드라이버는 PAGE_SIZE - 80 크기 이하의 파일만 다룬다.

struct proc_dir_entry *root_proc_dir;
root_proc_dir = proc_mkdir("testdir", 0);

struct proc_dir_entry *root_proc_file;
root_proc_file = create_proc_entry("testfile", S_IFREG|S_IRWXU, root_proc_dir);
if ( ! root_proc_file )
    return CU_ERROR;
root_proc_file->read_proc = ...
root_proc_file->write_proc = ...

◇ proc 파일은 proc 디렉토리와 달리 읽기와 쓰기에 대한 함수를 제공해야 한다. 그렇지 않으면 app에서 읽기나 쓰기가 실패한다.

int read_proc_test (char *page, char **start, off_t off, int count, int *eof, void *data_unused)
{
    page에 쓴다.
    *eof = 1;
    return 써 넣어진 데이터 수;
}

◇ page는 파일 전체의 메모리 주소고, 이 주소가 가리키는 공간의 크기는 PAGE_SIZE다. 그러나 이 크기 모두를 사용하는 것보다 PAGE_SIZE-80 크기로 생각하고 작성하는 편이 안전하다.
◇ 함수 반환값이 app에서 요구한 크기보다 작고, *eof에 0을 대입하여 반환하면 계속 호출된다. 그러므로 *eof에 1을 대입하고 함수를 종료하는 편이 안전하다. *eof에 0을 대입하고 함수를 종료하는 경우는 proc 파일 스트림을 구현하기 위한 방법을 사용할 때이다.

int write_proc_test (struct file *file, const char *buffer, unsigned long count, void *data)
{
    사용자 공간의 메모리인 buffer의 내용을 커널 공간에 써넣는다.
    return 처리된 데이터 수
}

◇ buffer는 사용자 메모리 공간으로 직접 접근되지 않으므로 copy_from_user() 함수 등을 이용하여 커널 메모리 공간에 복사한 후 사용해야 한다.





저작자 표시
신고
Posted by 지니넷 Trackback 0 Comment 0
<include/stat.h>

■ 파일 타입 상수

ID        Vlaue      Description
--------  -------    ---------------------------------------------------
S_IFMT    0170000    특수 파일을 나타내는 bit mask와 같은 역할을 한다
S_IFSOCK  0140000    socket interface
S_IFLINK  0120000    link
S_IFREG   0100000    일반 normal file
S_IFBLK   0060000    block device file
S_IFDIR   0040000    directory file
S_IFCHR   0020000    character device file
S_IFIFO   0010000    FIFO file
S_ISUID   0004000    setuid bit이 설정된 파일
S_ISGID   0002000    setgid bit이 설정된 파일
S_ISVTX   0001000    sticky bit이 설정된 파일


■ 접근 허가 상수

ID        Vlaue      Description
--------  -------    ---------------------------------------------------
S_IRWXU   0000700    owner에 대한 read, write, excute 권한
S_IRUSR   0000400    owner에 대한 read 권한
S_IWUSR   0000200    owner에 대한 write 권한
S_IXUSR   0000100    owner에 대한 excute 권한
--------  -------    ---------------------------------------------------
S_IRWXG   0000070    group에 대한 read, write, excute 권한
S_IRGRP   0000040    group에 대한 read 권한
S_IWGRP   0000020    group에 대한 write 권한
S_IXGRP   0000010    group에 대한 excute 권한
--------  -------    ---------------------------------------------------
S_IRWXO   0000007    other에 대한 read, write, excute 권한
S_IROTH   0000004    other에 대한 read 권한
S_IWOTH   0000002    other에 대한 write 권한
S_IXOTH   0000001    other에 대한 excute 권한

#define S_IRWXUGO   (S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO   (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO     (S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO     (S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO     (S_IXUSR|S_IXGRP|S_IXOTH)

저작자 표시
신고
Posted by 지니넷 Trackback 0 Comment 0

함수

2008.07.30 15:09 : 개발

$ cat text
testing the awk command

length() ; 각 행 길이를 구한다.
$ awk '{ i = length($0); print i }' text
23

index() ; 문자열이 처음 나타난 위치를 반환한다.
$ awk '{ i = index($0,"ing"); print i}' text
5

split() ; 문자열을 토큰으로 분리한다. (행을 단어로)
$ awk 'BEGIN { i = 1 } { n = split($0,a," "); while (i <= n) {print a[i]; i++;} }' text
testing
the
awk
command



신고
Posted by 지니넷 Trackback 0 Comment 0

데몬 프로세스

2008.07.28 14:59 : 개발
- init 프로세스의 child
- 단말과 연결되지 않는다.

■ 만드는 방법
1. fork()를 호출해 데몬을 만들 프로세스를 생성한다.
2. exit() 시스템 콜을 이용해 부모 프로세스를 종료한다.
   부모 프로세스가 종료되면 자연히 자식 프로세스의 부모는 init 프로세스가 된다.
3. setsid()를 이용해 데몬 프로세스에 새로운 프로세스 그룹과 세션을 할당한다.
   이렇게 하면 단말과 차단됨을 보장한다.
4. chdir()을 통해 실행 디렉토리를 루트 디렉토리로 변경한다.
   루트 디렉토리로 변경하면 관리자가 혹시라도 저지를 수 있는 디렉토리 언마운트를 사전에 방지한다.
5. 부모로부터 상속한 열린 파일 지시자들을 모두 제거한다.
6. stdin, stdout, stderr 파일 지시자를 /dev/null 디바이스로 redirect 한다.





신고
Posted by 지니넷 Trackback 0 Comment 0

ABI

2008.07.28 14:42 : 개발
- Application Binary Interface
- 컴파일된 프로그램(obj)들 간의 저수준 인터페이스를 정의
cf) ABI는 obj 파일과 관련되어 있고, API(Application Programming Interface)는 source code 컴파일 과정에서 개입하는 것으로 서로 다르다.
- 호출 규약 명세서를 정의한다.
. 함수 인자 전달 방법과 반환값 전달 방법 포함
- 다양한 컴파일러가 만들어낸 여러 obj 파일들을 함께 링크시킬 수 있는 이유이다.
- 아키텍처와 운영체제마다 다르다.

API를 이용하면 시스템콜을 직접 호출하지 않기 때문에 하드웨어에 의존적인 코드가 하나도 없다. 결국 API는 이식성을 위한 운영체제의 표준을 제공하는 수단이라고 정의할 수 있다.
API소스코드 수준의 호환성을 제공한다면 ABI바이너리 수준에서 호환성을 제공한다. ABI는 바이트 순서, 레지스터 사용, 시스템 콜 호출 방식, 링킹, 오브젝트 코드 포맷 등에 대한 규격을 제공한다. 이를테면, 시스템콜을 호출할 때 어떤 레지스터를 사용할 것인지, 오브젝트 코드 포맷을 ELF로 할 것인지를 결정하는 것이다. 이러한 규약이 정해져야 바이너리 호환을 제공할 수 있다.

x86 ABI
PowerPC ABI


신고
Posted by 지니넷 Trackback 0 Comment 0

semaphore

2008.05.19 13:41 : 개발
◇ 세마포어 3가지 종류
- counting semaphore
- binary semaphore
- MUTEX : Mutual Exclusion

◇ 세마포어 operation
- P operation (wait)
자원을 가져가는 것, 즉 세마포어의 값이 줄어드는 것
- V operation (post)
사용이 끝나서 자원을 반환하여 세마포어의 값을 증가시키는 것

◇ 세마포어와 뮤텍스의 차이점
- 순서보장 (세마포어)
세마포어는 한정된 자원을 순서대로 줄서서 자원을 배분받게 된다. 뮤텍스는 공유 자원의 독점적 사용을 목적으로 하기 때문에 어느 시점에서든지 독점적으로 사용할 수만 있다면 문제가 없으므로 순서를 보장하는 것은 필요조건이 아니다.  물론 뮤텍스도 세마포어처럼 순서를 보장하는 방식으로 구현해줘도 문제가 없지만, 대기열을 만들지 않는 것이 뮤텍스의 특징이기 때문에 구현될 필요가 없다.
- 소유권 (뮤텍스)
소유권 개념은 뮤텍스에는 존재하지만 세마포어엔 없다.
뮤텍스에 lock을 건 쓰레드가 소유권을 가지고 있으며, 이 쓰레드에서 풀어주지 않으면 다른 쓰레드는 unlock을 할 수 없다. 그러나 세마포어는 소유권이란게 없기 때문에, 자원을 획득한 프로세스나 쓰레드가 반납하기 전에도 다른 프로세스나 쓰레드가 얼마든지 반납할 수 있다.


신고
Posted by 지니넷 Trackback 0 Comment 0

mmap

2008.05.19 11:23 : 개발
- mmap(2), munmap(2), msync(2)
- mmap은 두 가지 방식으로 만들 수 있는데, MAP_SHARED와 MAP_PRIVATE 형태이다.
. MAP_SHARED는 메모리를 변경하면 원본 파일에 변경된 내용이 적용된다. 따라서 여러개의 프로세스가 모두 하나의 메모리와 파일을 사용하는 것처럼 보인다.
. MAP_PRIVATE의 경우는 처음에 만들어지는 순간 파일의 내용을 복사본으로 고유의 영역에 메모리맵을 만들기 때문에 메모리맵을 변경시켜도 원본 파일은 변경되지 않는다.





신고
Posted by 지니넷 Trackback 0 Comment 0

SysV IPC vs. POSIX IPC

2008.05.19 10:26 : 개발
- SysV IPC는 SysV 방식의 API 함수를 사용하는 세마포어, 공유 메모리, 메시지 큐를 의미한다.
- SysV IPC 자원들은 IPC Key와 IPC ID, 소유권, 소유 권한(mode)을 갖고 있다.
. IPC Key는 자원을 얻기 위해서 사용하는 것으로, 이 키를 통해서 자원의 ID값을 얻는다.
. 일반적으로 정수인 key_t 형으로 표현되며, ftok(3)를 사용하여 생성한다.
   
    shm_key = ftok("/usr/local/bin/ipc_daemon", 101);

. IPC_PRIVATE ; 이는 '0'값으로 IPC_PRIVATE 키를 사용하여 IPC를 생성하면 랜덤하게 IPC를 생성시켜 준다.
   
    sem_id = semget(IPC_PRIVATE, n_sem, IPC_CREATE|user_mode);

- SysV IPC 자원들은 각각 semctl(2), shmctl(2), msgctl(2) 등을 이용하여 자원의 정보를 가져온다거나 시스템에서 제거하거나 할 수 있다.

◇ SysV IPC 유틸리티
- ipcs
IPC status, 시스템 내의 SysV IPC 자원의 정보를 출력한다.
- ipcrm
IPC remove, 시스템 내의 SysV IPC 자원을 제거한다.


■ POSIX IPC

- realtime 계열이므로 rt 라이브러리(-lrt)를 링킹해야 하는 문제가 있다.


신고
Posted by 지니넷 Trackback 0 Comment 0


티스토리 툴바