Linux System Programming

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Chapter 6: System Data Files and Information
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
6 레이스 컨디션.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Oracle Embedded SQL Pro*C : Chap 5 Copyright by SunYoung Kim
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Linux System Programming
8장 프로세스.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Department of Computer Engineering
Signal & Inter-Process Communication
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
Linux System Programming
Department of Computer Engineering
1 유닉스 시스템 프로그래밍 개요.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
Multi-thread Programming
6 프로세스 생성과 실행.
조 병 규 Software Quality Lab. 한국교통대학교
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Linux System Programming
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
레이스 컨디션.
제 12장 I/O멀티플렉싱(Multiplexing)
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
Department of Computer Engineering
4 시스템 정보.
Department of Computer Engineering
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
Linux System Programming
4 시스템 정보.
시스템에 설치된 운영체제에 대한 기본 정보 검색
07. 디바이스 드라이버의 초기화와 종료 김진홍
Linux/UNIX Programming APUE (Files & Directories)
Term Project Team Member
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
임베디드 실습 # LED, 7’Segment 제어
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Department of Computer Engineering
2007 1학기 11 프로젝트 기초 실습.
14장. 포인터와 함수에 대한 이해.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
Chapter 13 Input/Output and Files
5 프로세스 정보.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Signal & Inter-Process Communication
Linux Programming Spring 2008
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Department of Computer Engineering
Execution with Unnecessary Privileges
3. 모듈 (5장. 모듈).
구조체(struct)와 공용체(union)
argc, argv 의 사용방법 #include <stdio.h>
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
Presentation transcript:

Linux System Programming Linux Environment Programming Kongju National University Linux System Programming 1/27

Linux System Programming Contents Shell에서 프로그램으로 파라메터 전달 시간 확인 임시파일 사용 User information 구하기 Host computer information 구하기 System Error Logging 작성 및 환경 설정 Kongju National University Linux System Programming 2/27

Linux System Programming 1. Parameter Transfer C언어로 작성된 프로그램은 main()부터 시작 외부의 인수 전달은 main()함수의 전달 인수로 입력 main(int argc, char *argv[]) ex: % mypro left right “and center”  argc=4 argv={“mypro”, “left”, “right”, “and center”} Parameter : option(-) , argument Kongju National University Linux System Programming 3/27

Linux System Programming argc,argv[]의 parsing #include <stdio.h> main(int argc, char *argv[]) { int arg; for(arg = 0; arg < argc; arg++) { if(argv[arg][0] == '-') printf("option: %s\n", argv[arg]+1); else printf("argument %d: %s\n", arg, argv[arg]); } Kongju National University Linux System Programming 4/27

Linux System Programming getopt() main()의 파라메터 parsing을 하는 함수 #include <unistd.h> extern char *optarg; extern int optind, opterr, optopt; int getopt(int argc,char const *argv[],const char *optstring);  getopt(): 더 이상 처리할 파라메터가 없을 때 –1 return  optstring: option을 표현하는 문자의 목록. “:”으로 option에 따르는 value가 있음을 표시  argument: option에 따르는 value, 외부변수 optarg의 의해 전달  특별한 option “--”는 따르는 value가 없음  optopt: 지정된 option이외 option형식의 입력이 있을 때 “?”를 반환하고 optopt에 그 value를 전달  option이 따르는 value를 요구함에도 value가 없을 때 getopt()는 “:”를 전달  외부변수 optind는 다음 처리할 argv의 index Kongju National University Linux System Programming 5/27

Linux System Programming getopt()의 예 #include <stdio.h> #include <unistd.h> main(int argc, char *argv[]) { int opt; while((opt = getopt(argc, argv, "if:lr")) != -1) { switch(opt) { case 'i': /* option */ case 'l': /* option */ case 'r': printf("option: %c\n", opt); break; case 'f': /* option with argument */ printf("filename: %s\n", optarg); break; case ':': /* can’t get argument */ printf("option needs a value\n"); break; case '?': printf("unknown option: %c\n", optopt); break; } for(; optind < argc; optind++) printf("argument: %s\n", argv[optind]); Kongju National University Linux System Programming 6/27

Linux System Programming getopt()의 동작의 예 % gcc –o argopt argopt.c % ./argopt –i –lr ‘hi ther’ –f fred.c –q option: i option: l option: r filename: fred.c argopt: illegal invalid option –q unknown option: q argument: hi there *optstring if:lr에서 f: 는 –f 다음에 argument value가 있다는 것을 표시 Kongju National University Linux System Programming 7/27

Linux System Programming 2. Time & Date in system Unix/Linux 시스템은 1970년1월1일 GMT 0시 0분 0초를 기준 시간으로 지정(=Epoch time) MS-DOS는 1980년의 기준, 나머지는 동일 모든 시간은 기준 시간에서 초단위로 계산 32bits 시스템에서는 2038년에 원점으로 환원 이를 Y2K38 problem, 해결은 그 이전에 32bits 보다 크게 확장 Linux에서는 long time_t 변수 사용 관련 Header file: /usr/include/time.h Kongju National University Linux System Programming 8/27

Linux System Programming time() 기준시간 부터 현재 시간까지 초단위로 반환 #include <time.h> time_t time(time_t *tloc); tloc: null pointer경우 time()에서 return #include <time.h> #include <stdio.h> #include <unistd.h> main() { int i; time_t the_time; for(i = 1; i <= 10; i++) { the_time = time((time_t *)0); printf("The time is %ld\n", the_time); sleep(2); } Kongju National University Linux System Programming 9/27

Linux System Programming gmtime() 저수준 시간값을 일반적인 구조체로 변환 기능 #include <time.h> struct tm *gmtime(const time_t *timeval); struct tm { int tm_sec /*0-59까지의 초*/ int tm_min /*0-59까지의 분*/ int tm_hour /*0-23까지의 시*/ int tm_mday /*1-31까지의 일*/ int tm_mon /*0-11까지의 월,1월은 0*/ int tm_year /*1900 이후의 년*/ int tm_wday /*0-6까지의 요일,월요일은 0*/ int tm_yday /*0-365까지의 날짜*/ int tm_isdst /*0-60까지의 초*/ int tm_sec /*일광절약 daylight saving time 적용여부*/ } Kongju National University Linux System Programming 10/27

Linux System Programming gmtime() #include <time.h> #include <stdio.h> main() { struct tm *tm_ptr; time_t the_time; (void) time(&the_time); tm_ptr = gmtime(&the_time); printf("Raw time is %ld\n", the_time); printf("gmtime gives:\n"); printf("date: %02d/%02d/%02d\n", tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday); printf("time: %02d:%02d:%02d\n", tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); } Kongju National University Linux System Programming 11/27

localtime(),asctime(),ctime() #include <time.h> struct tm *localtime(const time_t *timeval); char *asctime(const struct tm *timeptr); char *ctime(const time_t *timeval); localtime()은 time_t형의 값인 GMT시간을 시스템에 설정된 지역시간 (한국은 KST)과 일광절약 시간제로 변환 asctime()함수는 struct tm의 값을 ASCII string으로 값을 변환하여 전달. 길이는 26으로 고정 ctime()은 local time으로 변환한 뒤 이를 asctime()을 동작시킨 것과 동일 즉 ctime(timeval)=asctime(localtime(timeval)) Kongju National University Linux System Programming 12/27

localtime(),asctime(),ctime()의 예 #include <time.h> #include <stdio.h> main() { time_t timeval; (void)time(&timeval); printf("The date is: %s", ctime(&timeval)); printf("The date is: %s", asctime(localtime(&timeval))); } Kongju National University Linux System Programming 13/27

3. Temporary file handling 프로그램 동작중 임시 파일 생성 계산의 중간 결과을 임시 보관 위험한 동작을 수행하기 전 파일의 사본을 저장 단점 임시 파일은 multi-tasking 환경에서 다른 프로세스에 의해 사용되어 질 수 있다. 이는 구별되어 지는 독특한 이름으로 지정되어야 함. Kongju National University Linux System Programming 14/27

Linux System Programming tmpnam(), tmpfile() #include <stdio.h> char *tmpnam(char *s); FILE *tmpfile(void); tmpnam()은 기존 임시파일과 다른 유효한 이름을 반환 string s가 null이 아니라면 s에 의해 전달 string s의 최대 길이는 L_tmpnam tmpnam()을 이용하는 최대 호출 횟수는 한 프로그램에서 TMP_MAX tmpfile()함수는 임시파일 stream pointer를 반환하며, “w+”로 fopen()으로 읽기와 쓰기가 가능한 형태로 open tmpfile()이 실패할 경우 errno를 전달 Kongju National University Linux System Programming 15/27

Linux System Programming tmpnam(),tmpfile()의 예 #include <stdio.h> main() { char tmpname[L_tmpnam]; char *filename; FILE *tmpfp; filename = tmpnam(tmpname); printf("Temporary file name is: %s\n", filename); tmpfp = tmpfile(); if(tmpfp) printf("Opened a temporary file OK\n"); else perror("tmpfile"); } Kongju National University Linux System Programming 16/27

Linux System Programming 4. User Information UID : 사용자 식별자 확인 사용자 정보는 /etc/passwd file을 기준(확인 요!) 현재 Linux 시스템은 password를 shadowing /etc/passwd , /etc/shadow 형식은 /usr/include/sys/type.h의 typedef struct uid_t 관련함수 getuid() getlogin() getpwuid() getpwnam() Kongju National University Linux System Programming 17/27

Linux System Programming getuid(), getlogin() #include <sys/types.h> #include <unistd.h> uid_t getuid(viod); char *getlogin(void); getuid()는 실행중인 프로그램의 User의 uid 반환 getlogin() 실행중인 프로그램의 login name 반환 Kongju National University Linux System Programming 18/27

getpwuid(), getpwnam() #include <sys/types.h> #include <pwd.h> struct passwd *getpwuid(uid_t uid); struct passwd *getpwnam(const char *name); struct passwd { char *pw_name /* user login name */ uid_t pw_uid /* UID numnber */ gid_t pw_gid /* GID number */ char *pw_dir /* user home directory $HOME */ char *pw_shell /* user’s shell */ } Kongju National University Linux System Programming 19/27

getuid(),getlogin(),getpwuid()… #include <sys/types.h> #include <pwd.h> #include <stdio.h> #include <unistd.h> main() { uid_t uid; gid_t gid; struct passwd *pw; uid = getuid(); gid = getgid(); printf("User is %s\n", getlogin()); printf("User IDs: uid=%d, gid=%d\n", uid, gid); pw = getpwuid(uid); printf("UID passwd entry:\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n", pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell); pw = getpwnam("root"); printf("root passwd entry:\n"); printf("name=%s, uid=%d, gid=%d, home=%s, shell=%s\n", } Kongju National University Linux System Programming 20/27

5. Host compuer information 프로그램이 실행중인 computer에 대한 정보 #include <unistd.h> int gethostname(char *name,size_t namelen); #include <sys/utsname.h> int uname(struct utsname *name); gethostname(): name에 실행중인 computer의 이름 반환 return value : 0(success), -1(fail) struct utsname { char sysname[] /* OS name */ char nodename[] /* host computer name */ char release /* system release number */ char version /* system version number */ char machine /* status of system hardware */ } Kongju National University Linux System Programming 21/27

gethostname(),uname() #include <sys/utsname.h> #include <unistd.h> #include <stdio.h> main() { char computer[256]; struct utsname uts; if(gethostname(computer, 255) != 0 || uname(&uts) < 0) { fprintf(stderr, "Could not get host information\n"); exit(1); } printf("Computer host name is %s\n", computer); printf("System is %s on %s hardware\n", uts.sysname, uts.machine); printf("Nodename is %s\n", uts.nodename); printf("Version is %s, %s\n", uts.release, uts.version); Kongju National University Linux System Programming 22/27

Linux System Programming 6. System Error Logging Logging : 에러메시지, 동작과정의 기록 /usr/adm, /var/log : system-wide logging */var/log/message /etc/syslog.conf : system-wide log에 대한 설정 log보기 : %dmesg , %last , %lastcom User Error log on user’s file 사용자 프로그램에서 별도 log를 관리하는 것은 file을 생성하여 별도 관리 : fopen(), fprintf() 사용 system error logging 중요함수 syslog() openlog() closelog() setlogmask() Kongju National University Linux System Programming 23/27

syslog() : system-wide log #include <syslog.h> void syslog(int priority,const char *message, argument . . . ); syslog(): 로그 기능에 로그 메시지 전달 return value : 0(success), -1(fail) priority:log level, 메시지의 중요도 LOG_USER: 사용자에 의한 생성 system생성 LOG일경우 아래의 log level LOG_EMERG : 비상사태, 모든 사용자에게 전달 LOG_ALERT : 높은 정도의 상태, 운영자에게 전달 *이하 로그파일에 기록 LOG_CRIT : hardware failure등의 치명적인 error, LOG_ERR : 일반적인 error LOG_WARNING : 경고 LOG_NOTICE : 주의 LOG_INFO : 단순 정보 LOG_DEBUG : 시스템 debug message Kongju National University Linux System Programming 24/27

Linux System Programming syslog() #include <syslog.h> #include <stdio.h> main() { FILE *f; f = fopen("not_here","r"); /*존재하지 않는 파일-열기 당연 error*/ if(!f) syslog(LOG_ERR|LOG_USER,"oops - %m\n"); } 화면에 error message는 출력되지 않는다 /var/log/messages file의 마지막 줄에 Sept …….. tilde syslog:oops – No such file or directory 를 볼 수 있음 Kongju National University Linux System Programming 25/27

Linux System Programming Log환경 설정 함수 #include <syslog.h> void openlog(const char *ident, int logopt, int facility); void closelog(void); int selogmask(int maskpri); ident: log message에 연결되는 string facility: loggin의 기본 동작 값(default는 LOG_USER) logopt: loggin의 동작 환경 LOG_PID: 프로세스 번호를 logging LOG_CONS:logging을 할 수 없을 경우 console로 출력 LOG_ODELAY:syslog() 처음 호출부터 logging LOG_NDELAY:syslog()에 즉시 logging logmask(): log message의 우선순위를 위한 log mask 설정 LOG_MASK(priority) 혹은 LOG_UPTO(priority) macro 이용 Kongju National University Linux System Programming 26/27

openlog(),closelog(),logmask() #include <syslog.h> #include <stdio.h> #include <unistd.h> main() { int logmask; openlog("logmask", LOG_PID|LOG_CONS, LOG_USER); syslog(LOG_INFO,"informative message, pid = %d", getpid()); syslog(LOG_DEBUG,"debug message, should appear"); logmask = setlogmask(LOG_UPTO(LOG_NOTICE)); syslog(LOG_DEBUG,"debug message, should not appear"); } 화면에 error message는 출력되지 않는다 /var/log/messages file의 마지막 줄에 Sept . . . tilde logmask[195]:informative message,pid=… /var/log/debug file의 마지막줄에 Sept . . . tilde logmask[195]: debug message, should not appear Kongju National University Linux System Programming 27/27