setpgrp() 함수

OS/Linux 2015. 12. 14. 12:03

setpgrp()

자신의 프로세스 그룹을 자신의 프로세스 아이디로 바꿔줍니다.

int main(int argc, char *argv[])

{

    int newpgid;

    newpgid = setpgrp();

     work();

     return 0;

}

'OS > Linux' 카테고리의 다른 글

CentOS 5.1 gcc 설치법  (0) 2016.06.16
리눅스 파일 찾기 - find  (0) 2016.05.09
execve() 함수  (0) 2015.12.13
open함수 사용법  (0) 2015.12.13
atoi() 사용법  (0) 2015.12.13
Posted by 知彼知己百戰不殆
,

execve() 함수

OS/Linux 2015. 12. 13. 19:49
설명

다른 프로그램을 실행하고 자신은 종료합니다. execle() 이나 execve() 처럼 exec 함수 중 e 로 끝나는 함수는 환경변수를 지정할 수 있습니다. execle() 과의 차이점은 프로그램의 인수와 환경변수 목록을 모두 이중 배열로 처리했다는 점입니다.

execle()함수는 

char *envp[]   = { "HTTP=FORUM.FALINUX.COM", NULL};

execle( "./show_envp", "./show_envp", "HTTP", NULL, envp);

execve() 함수는 아래와 같습니다. 

char *argv[]   = { "./show_envp", "HTTP", NULL};
char *envp[]   = { "HTTP=FORUM.FALINUX.COM", NULL};

execve( "./show_envp", argv, envp);

이렇게 다른 프로그램을 실행하고 자신은 종료해 주는 함수에는 아래와 같이 여러 가지가 있습니다.

함수 이름 
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg ,..., char * const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[]);
int execve (const char *filename, char *const argv [], char *const envp[]);

각 함수는 아래와 같은 차이가 있습니다. 

함수 이름 프로그램 지정명령라인 인수함수 설명 
execl디렉토리와 파일 이름이 합친 전체 이름 인수 리스트 환경 설정 불가 
execlp파일 이름 인수 리스트 환경 설정 불가
execle디렉토리와 파일 이름이 합친 전체 이름 인수 리스트환경 설정 가능 
execv디렉토리와 파일 이름이 합친 전체 이름 인수 배열 환경 설정 불가
execvp파일 이름 인수 배열 환경 설정 불가
excve전제 경로 명 인수 배열 환경 설정 가능 

프로그램 지정에서 디렉토리와 파일 이름이 합친 전체 이름으로 지정하는 것과 파일 이름만 지정하는 것의 차이는, execl()처럼 전체 이름을 요구하는 함수는 지정한 디렉토리의 프로그램을 실행하지만 execlp()함수처럼 프로그램 이름만 요구하는 함수는 현재 PATH 환경에 등록된 디렉토리를 있는 프로그램을 실행합니다.

즉,

execl()은 아래와 같이 프로그램이 들어 있는 디렉토리명까지 입력해 주어야 합니다. 

execl( "/bin/ls", "/bin/ls", NULL);

아래와 같이 프로그래명만 입력하면 실행이 안 됩니다. 

execl( "ls", "ls", NULL);

그러나 execlp()는 PATH에 등록된 모든 디렉토리에 있는 프로그램을 실행하므로 프로그램 이름만 입력해도 실행이 됩니다.

execlp( "ls", "ls", NULL);

 

인수 중복 이유 그런데 설명을 보면 프로그램 이름을 중복해서 입력했는데, 이는 프로그램을 실행하면 첫번째 인수가 실행한 프로그램의 전체 이름이기 때문입니다.

다시 말씀 드려 man()함수의 인수준 *argv[]의 첫번째 문자열 argv[0]은 실행한 프로그램의 이름입니다. 

int main( int argc, char *argv[])
{
   printf( "%s\n", argv[0]);
   return 0;
}

예로

   ]$ ./a.out

으로 실행했다면 argv[0]은 "./a.out"이 되며, 

   ]$ /home/jwjw/prjs/test_fun/a.out

으로 실행했다면 argv[0]은 "/home/jwjw/prjs/test_fun/a.out"이 됩니다. 또한 어떤 프로그램은 이 첫번재 인수를 이용할 수 있으므로 파일의 전체 이름을 입력해 주는 것이 좋습니다.

헤더unistd.h
형태int execle( const char *path, const char *arg , ..., char * const envp[]);
인수char *char디레토리 포함 전체 파일 명 
 const char *arg인수 목록 
 char * const envp[]환경 설정 목록 
반환int실패일 때만 -1 
예제

execle() 작동을 확인하기 위해, 환경변수를 출력하는 프로그램을 먼저 작성하겠습니다.

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[])
{
   if (1 < argc)  printf( "환경변수 %s 는 %s\n", argv[1], getenv( argv[1]));
   else           printf( "실행방법: show_envp [화경변수]\n");
   return 0;
}

이 프로그램은 실행 중 인수로 받은 문자열의 이름에 따른 환경변수값을 출력합니다. show_env로 컴파일했다면 아래와 같이 실행하여 환경 변수값을 확인할 수 있습니다. 

]$ show_envp HOME
환경변수 HOME 는 /home/jwjw

이제 환경 변수를 설정하고 show_envp를 실행시켜 보겠습니다. 

#include <stdio.h>
#include <unistd.h>

int main()
{
   char *argv[]   = { "./show_envp", "HTTP", NULL};
   char *envp[]   = { "HTTP=FORUM.FALINUX.COM", NULL};

   execve( "./show_envp", argv, envp);

   printf( "이 메시지가 보이면 지정된 프로그램이 \
없거나 어떤 문제로 실행되지 못한 것입니다.\n");
}
]$ ./a.out

환경변수 HTTP 는 FORUM.FALINUX.COM
]$


출처: http://forum.falinux.com/zbxe/?mid=C_LIB&page=3&document_srl=408569

'OS > Linux' 카테고리의 다른 글

리눅스 파일 찾기 - find  (0) 2016.05.09
setpgrp() 함수  (0) 2015.12.14
open함수 사용법  (0) 2015.12.13
atoi() 사용법  (0) 2015.12.13
send 함수  (0) 2015.12.13
Posted by 知彼知己百戰不殆
,

open함수 사용법

OS/Linux 2015. 12. 13. 18:51
설명

파일을 사용하기 위해 열기(open)합니다. 파일 열기에는 표준 함수인 fopen()이 있습니다. fopen() 이 표준 C 라이브러리에서 제공한다면 open()은 리눅스에서 제공하는 함수로 더 자세한 내용은 포럼 강좌 게시판의 fopen() and open()글을 참고하여 주십시오. 

파일을 open할 때에는 용도에 따라 읽기 전용, 쓰기 전용 또는 읽기와 쓰기가 모두 되는 옵션을 지정하여 열기를 합니다.

* 아래의 옵션은 모두 fcntl.h 에 정의되어 있습니다. 

열기 옵션 옵션 설명 
O_RDONLY읽기 전용응로 열기 
O_WRONLY쓰기 전용으로 열기 
O_RDWR읽기와 쓰기가 모두 가능 

이 외에도 더 다양한 옵션이 있습니다. 

기타 옵션 옵션 설명 
O_CREAT

해당 파일이 없으면 생성합니다.

O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 입니다.

O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 합니다. 

open( "jwmx", O_WRONLY | OCREAT, 0644);

O_EXCL

O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라집니다. 

O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있습니다.

fd = open( "./test.txt", O_WRONLY | O_CREAT | O_EXCL, 0644) 

즉, 이렇게 O_EXCL을 함께 사용하면, 파일이 없을 경우에는 O_CREAT 영향을 받아 쓰기 전용의 파일이 생성하고, 파일이 이미 존재하면 open()이 실패됩니다. 

O_TRUNC기존의 파일 내용을 모두 삭제합니다. 
O_APPEND파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 됩니다. 
O_NOCITTY열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않습니다. 
O_NONBLOCK읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀합니다. 
O_SYNC쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다립니다. 즉, 물리적으로 쓰기가 완료되어야 복귀하게 됩니다. 
헤더fcntl..h
형태int open (const char *FILENAME, int FLAGS[, mode_t MODE])
인수char *FILENAME대상 파일 이름 
int FLAGS파일에 대한 열기 옵션 
[, mode_t MODE]O_CREAT 옵션 사용에 의해 파일이 생성될 때 지정되는 파일 접근 권한 
반환int정상으로 open했다면 파일 디스크립터의 양의 정수 값. 실패하면 -1을 반환 
예제

예제에서는 test.txt라는 파일이 없으면 파일을 생성하고 파일 않에 "forum.falinux.com"을 쓰기를 합니다. 그러나 이미 파일이 있다면 프로그램을 종료합니다.

출처 : http://forum.falinux.com/zbxe/index.php?document_srl=408448&mid=C_LIB

'OS > Linux' 카테고리의 다른 글

setpgrp() 함수  (0) 2015.12.14
execve() 함수  (0) 2015.12.13
atoi() 사용법  (0) 2015.12.13
send 함수  (0) 2015.12.13
기본 파일 디스크럽터  (0) 2015.12.13
Posted by 知彼知己百戰不殆
,