블로그 이미지
GUCCI

카테고리

전체보기 (111)
여행 (1)
기기 (2)
쇼핑 (0)
게임 (0)
etc. (6)
취업이야기 (0)
업무일지 (5)
리눅스 (38)
웹프로그래밍 (2)
네트워크 (4)
JAVA (17)
Android (0)
IOS (2)
LUA (8)
C/C++ (1)
Objective C (2)
SERVER (2)
그누보드4 (1)
MSSQL (2)
Programming (1)
자바스크립트 (4)
HTML/CSS (1)
LGNAS (0)
Total
Today
Yesterday

'리눅스'에 해당되는 글 3건

  1. 2012.02.08 getopt() 5
  2. 2012.02.08 리눅스 lspci 명령어 2
  3. 2012.02.08 리눅스 Errorno errno 4

getopt()

리눅스 / 2012. 2. 8. 19:01

■ getopt 함수란

 유닉스나 리눅스에서 프로그램 실행 시 '-a', '-l' 등 별도의 옵션을 줄 수 있다. 이러한 옵션(아규먼트)을 쉽게 처리하기 위해 만들어진 함수가 getopt이다. 유닉스는 unistd.h를 리눅스는 getopt.h 헤더파일을 include하면 사용 할 수 있다. 그리고 이 함수는 main함수에서 많이 사용되고 있다.

 

모든 C(C++)로 된 프로그램은 보통 main 함수를 정의할 때 아래와 같이 두 개의 파라미터를 가진다. 프로그램이 커맨드 라인에서 인수를 받는 방법은 main 함수를 통해서만 가능하다.

 

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

argc 파라미터는 커맨드 라인에서 넘어온 인수의 개수를 뜻하며, argv 파라미터는 C 문자열 벡터이다.  argv 의 각 요소들은 공백으로 분리된 개별적인 커맨드 라인 인수 문자열이다.


만약 프로그램에서 커맨드 라인 인수들의 구분이 간단하다면, 굳이 getopt 함수를 사용하디 않고 직접 argv로부터 간단하게 하나씩 인수를 가져올 수 있다. 하지만 프로그램이 한정된 인수들의 개수를 갖지 않거나 모든 인수들을 한꺼번에 취하지 않는다면 같은 방법으로 인수들을 취할 수도 있지만 그것을 구문 분석 하기 위해 getopt()를 사용해서 인수들을 처리하는 것이 보다 효과적이다. 예를들어 흔히 사용되어 지는 ls 명령어조차도 "ls -al"과 같은 옵션을 지원한다. ls -al 에서 보듯이 이것은 ls -a -l 로도 사용될수도 있고, ls -l -a 로도 사용될수 있다. 이것을 프로그램 내에서 사용자 정의 함수를 이용해서 처리하려고 하면 보통 일이 아닐것이다. 그럼 getopt 함수 사용예제를 보자.

 

■ getopt를 이용한 프로그램 인자 처리  

 getopt 를 이용해서 다양한 옵션을 처리하는 testopt 라는 프로그램을 만들어 보도록 하겠다. 프로그램 이름은 testopt.c로 하겠다.

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
 
void help(); 
void version(); 
int main(int argc, char **argv) 
{  
    int opt; 
    int port_num; 
    int fp; 
    int opt_ok; 
    char file_name[16]; 
    char buf[256]; 
 
    while((opt = getopt(argc, argv, "hvf:")) != -1)  
    { 
        switch(opt)  
        {  
            case 'h': 
                help();  
                break;  
            case 'v': 
                version();   
                break; 
            case 'f': 
                memcpy(file_name, optarg, 16); 
                opt_ok = 1; 
                break; 
        } 
    }  
    if (opt_ok != 1) 
    {  
        help(); 
        exit(0); 
    }  
 
    if (access(file_name, R_OK) != 0) 
    { 
        printf("파일이 존재하지 않습니다"); 
        exit(0); 
    } 
    if((fp = open(file_name, O_RDONLY)) == -1) 
    { 
        printf("file open error"); 
        exit(0); 
    } 
 
    memset(buf, '0', 256); 
    while(read(fp, buf, 256) > 0) 
    { 
        printf("%s", buf); 
        memset(buf, '0', 256); 
    } 
} 
 
void help() 
{ 
    printf("Usage: ./testopt [OPTION] [FILE]" 
           "  -h                도움말" 
           "  -f [FILE]         파일출력" 
           "  -v                버전출력"); 
    exit(0); 
} 
 
void version() 
{ 
    printf("Version : 1.01"); 
    exit(0); 
} 
 

매우 간단하고 이해가 쉬운 예제이다. getopt 를 이용해서 프로그램의 인자를 검사 해서 '-' 가 앞에 붙어 있는 인자는 옵션으로 간주해서 "hvf" 중 어느 옵션인지를 건사해서 해당 루틴을 실행시켜준다. 단 "f" 의 경우에는 ":" 가 붙어 있는데, 이는 "f" 옵션은 반드시 뒤에 값이 따라야 함을 명시하고 있다. 여기에서 값이란 화면에 출력하고픈 파일이름이다. 
[root@localhost test]# ./testopt -h  
Usage: ./testopt [OPTION] [FILE] 
  -h                            도움말 
  -f [FILE]                     파일출력 
  -v                            버전출력 
 [root@localhost test]# ./testopt -f 
./testopt: option requires an argument -- f 
Usage: ./testopt [OPTION] [FILE] 
  -h                            도움말 
  -f [FILE]                     파일출력 
  -v                            버전출력 

[출처] getopt()|작성자 시대유감


'리눅스' 카테고리의 다른 글

vi 에디터 명령어  (2) 2012.02.08
VI 편집기 사용법  (1) 2012.02.08
리눅스 lspci 명령어  (2) 2012.02.08
리눅스 Errorno errno  (4) 2012.02.08
리눅스 커널의 구조  (1) 2012.02.08
Posted by GUCCI
, |

리눅스 lspci 명령어

리눅스 / 2012. 2. 8. 19:00

■ lspci

시스템의 모든 PCI BUS와 장치에 대한 목록과 각개 하드웨어 설정 정보를 확인할 수 있는 명령어

 

■ Option

 옵션

설명 

 (없음)

 기본적인 하드웨어 정보가 출력된다. 주로 하드웨어 장치의 모델명이 출력된다.

 -v

 verbose를 뜻하며 장치에 대한 자세한 정보를 표시합니다.

 -vv

 very verbose를 뜻하며 PCI 장치가 말할 수 있는 모든 정보를 표시합니다.

[출처] lspci|작성자 시대유감

'리눅스' 카테고리의 다른 글

vi 에디터 명령어  (2) 2012.02.08
VI 편집기 사용법  (1) 2012.02.08
getopt()  (5) 2012.02.08
리눅스 Errorno errno  (4) 2012.02.08
리눅스 커널의 구조  (1) 2012.02.08
Posted by GUCCI
, |

리눅스 Errorno errno

리눅스 / 2012. 2. 8. 18:59
errno: 0 message: Success
errno: 1 message: Operation not permitted
errno: 2 message: No such file or directory
errno: 3 message: No such process
errno: 4 message: Interrupted system call
errno: 5 message: Input/output error
errno: 6 message: No such device or address
errno: 7 message: Argument list too long
errno: 8 message: Exec format error
errno: 9 message: Bad file descriptor
errno: 10 message: No child processes
errno: 11 message: Resource temporarily unavailable
errno: 12 message: Cannot allocate memory
errno: 13 message: Permission denied
errno: 14 message: Bad address
errno: 15 message: Block device required
errno: 16 message: Device or resource busy
errno: 17 message: File exists
errno: 18 message: Invalid cross-device link
errno: 19 message: No such device
errno: 20 message: Not a directory
errno: 21 message: Is a directory
errno: 22 message: Invalid argument
errno: 23 message: Too many open files in system
errno: 24 message: Too many open files
errno: 25 message: Inappropriate ioctl for device
errno: 26 message: Text file busy
errno: 27 message: File too large
errno: 28 message: No space left on device
errno: 29 message: Illegal seek
errno: 30 message: Read-only file system
errno: 31 message: Too many links
errno: 32 message: Broken pipe
errno: 33 message: Numerical argument out of domain
errno: 34 message: Numerical result out of range
errno: 35 message: Resource deadlock avoided
errno: 36 message: File name too long
errno: 37 message: No locks available
errno: 38 message: Function not implemented
errno: 39 message: Directory not empty
errno: 40 message: Too many levels of symbolic links
errno: 41 message: Unknown error 41
errno: 42 message: No message of desired type
errno: 43 message: Identifier removed
errno: 44 message: Channel number out of range
errno: 45 message: Level 2 not synchronized
errno: 46 message: Level 3 halted
errno: 47 message: Level 3 reset
errno: 48 message: Link number out of range
errno: 49 message: Protocol driver not attached
errno: 50 message: No CSI structure available
errno: 51 message: Level 2 halted
errno: 52 message: Invalid exchange
errno: 53 message: Invalid request descriptor
errno: 54 message: Exchange full
errno: 55 message: No anode
errno: 56 message: Invalid request code
errno: 57 message: Invalid slot
errno: 58 message: Unknown error 58
errno: 59 message: Bad font file format
errno: 60 message: Device not a stream
errno: 61 message: No data available
errno: 62 message: Timer expired
errno: 63 message: Out of streams resources
errno: 64 message: Machine is not on the network
errno: 65 message: Package not installed
errno: 66 message: Object is remote
errno: 67 message: Link has been severed
errno: 68 message: Advertise error
errno: 69 message: Srmount error
errno: 70 message: Communication error on send
errno: 71 message: Protocol error
errno: 72 message: Multihop attempted
errno: 73 message: RFS specific error
errno: 74 message: Bad message
errno: 75 message: Value too large for defined data type
errno: 76 message: Name not unique on network
errno: 77 message: File descriptor in bad state
errno: 78 message: Remote address changed
errno: 79 message: Can not access a needed shared library
errno: 80 message: Accessing a corrupted shared library
errno: 81 message: .lib section in a.out corrupted
errno: 82 message: Attempting to link in too many shared libraries
errno: 83 message: Cannot exec a shared library directly
errno: 84 message: Invalid or incomplete multibyte or wide character
errno: 85 message: Interrupted system call should be restarted
errno: 86 message: Streams pipe error
errno: 87 message: Too many users
errno: 88 message: Socket operation on non-socket
errno: 89 message: Destination address required
errno: 90 message: Message too long
errno: 91 message: Protocol wrong type for socket
errno: 92 message: Protocol not available
errno: 93 message: Protocol not supported
errno: 94 message: Socket type not supported
errno: 95 message: Operation not supported
errno: 96 message: Protocol family not supported
errno: 97 message: Address family not supported by protocol
errno: 98 message: Address already in use
errno: 99 message: Cannot assign requested address
errno: 100 message: Network is down
errno: 101 message: Network is unreachable
errno: 102 message: Network dropped connection on reset
errno: 103 message: Software caused connection abort
errno: 104 message: Connection reset by peer
errno: 105 message: No buffer space available
errno: 106 message: Transport endpoint is already connected
errno: 107 message: Transport endpoint is not connected
errno: 108 message: Cannot send after transport endpoint shutdown
errno: 109 message: Too many references: cannot splice
errno: 110 message: Connection timed out
errno: 111 message: Connection refused
errno: 112 message: Host is down
errno: 113 message: No route to host
errno: 114 message: Operation already in progress
errno: 115 message: Operation now in progress
errno: 116 message: Stale NFS file handle
errno: 117 message: Structure needs cleaning
errno: 118 message: Not a XENIX named type file
errno: 119 message: No XENIX semaphores available
errno: 120 message: Is a named type file
errno: 121 message: Remote I/O error
errno: 122 message: Disk quota exceeded
errno: 123 message: No medium found
errno: 124 message: Wrong medium t

[출처] errno|작성자 시대유감


'리눅스' 카테고리의 다른 글

vi 에디터 명령어  (2) 2012.02.08
VI 편집기 사용법  (1) 2012.02.08
getopt()  (5) 2012.02.08
리눅스 lspci 명령어  (2) 2012.02.08
리눅스 커널의 구조  (1) 2012.02.08
Posted by GUCCI
, |

최근에 달린 댓글

글 보관함