프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>

Slides:



Advertisements
Similar presentations
12장 프로세스.
Advertisements

Linux/UNIX Programming APUE (The Environment of a UNIX Process)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
6 레이스 컨디션.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Linux/UNIX Programming APUE (Process Control)
8장 프로세스.
9 파이프.
Signal & Inter-Process Communication
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
Department of Computer Engineering
Department of Computer Science and Engineering
1 유닉스 시스템 프로그래밍 개요.
6 프로세스 생성과 실행.
6 프로세스 생성과 실행.
조 병 규 Software Quality Lab. 한국교통대학교
UNIT 09 프로세스 제어 로봇 SW 교육원 3기.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Department of Computer Engineering
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Linux System Programming
Chapter 06 프로세스와 예약작업 관리 Solaris 1. 프로세스 관리
12장 프로세스.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
Signal & Inter-Process Communication
Term Project Team Member
Department of Computer Engineering
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
파이프와 exec 시스템 호출 (ls | wc)
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
8 메모리 매핑.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
14장. 포인터와 함수에 대한 이해.
5 프로세스 정보.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
Signal & Inter-Process Communication
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
Device Driver 임베디드 시스템 I.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
제어문 & 반복문 C스터디 2주차.
School of Electronics and Information. Kyung Hee University.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Department of Computer Engineering
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
Signal & Inter-Process Communication
Fucntion 요약.
Department of Computer Engineering
( Windows Service Application Debugging )
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
Homework #5 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
Homework #3 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
과제 4: Thread (5월 9일까지) 4장 연습문제 풀이
9 파이프.
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
수업 내용 수업 목표 강의 내용 강의 계획서 교과서 및 참고도서 평가 방법 수강생의 학습 방법 제안 강의자료 사이트
Signal & Inter-Process Communication
Presentation transcript:

프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h> 새로운 프로그램을 실행하는 가장 간단한 방법이나 비효율적이므로 남용하지 말 것 실행할 프로그램명을 인자로 지정 #include <stdlib.h> int system(const char *string); 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 int main(void) { 05 int a; 06 a = system("ps -ef | grep han > han.txt"); 07 printf("Return Value : %d\n", a); 08 09 return 0; 10 } [예제 6-1] system 함수 사용하기 (test1.c) # ex6_1.out Return Value : 0 # cat han.txt root 736 735 0 10:31:02 pts/3 0:00 grep han root 735 734 0 10:31:02 pts/3 0:00 sh -c ps -ef | grep han> han.txt

프로세스 생성[2] 프로세스 생성: fork(2) #include <sys/types.h> 새로운 프로세스를 생성 : 자식 프로세스 fork 함수를 호출한 프로세스 : 부모 프로세스 자식 프로세스는 부모 프로세스의 메모리를 복사 RUID, EUID, RGID, EGID, 환경변수 열린 파일기술자, 시그널 처리, setuid, setgid 현재 작업 디렉토리, umask, 사용가능자원 제한 부모 프로세스와 다른 점 자식 프로세스는 유일한 PID를 갖는다 자식 프로세스는 유일한 PPID를 갖는다. 부모 프로세스가 설정한 프로세스잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함 자식 프로세스의 tms구조체 값은 0으로 설정 부모 프로세스와 자식 프로세스는 열린 파일을 공유하므로 읽거나 쓸 때 주의해야 한다. #include <sys/types.h> #include <unistd.h> pid_t fork(void);

[예제 6-2] fork 함수 사용하기 (test2.c) ... 06 int main(void) { 07 pid_t pid; 08 09 switch (pid = fork()) { 10 case -1 : /* fork failed */ 11 perror("fork"); 12 exit(1); 13 break; 14 case 0 : /* child process */ 15 printf("Child Process - My PID:%d, My Parent's PID:%d\n", 16 (int)getpid(), (int)getppid()); 17 break; 18 default : /* parent process */ 19 printf("Parent process - My PID:%d, My Parent's PID:%d, " "My Child's PID:%d\n", (int)getpid(), (int)getppid(), (int)pid); 21 break; 22 } 23 24 printf("End of fork\n"); 26 return 0; 27 } fork함수의 리턴값 0은 자식 프로세스가 실행 # ex6_2.out Child Process - My PID:796, My Parent's PID:795 End of fork Parent process - My PID:795, My Parent's PID:695, My Child's PID:796

프로그램 종료시 수행할 작업 예약: atexit(2) 프로세스 종료 함수[1] 프로그램 종료: exit(2) status : 종료 상태값 프로그램 종료시 수행할 작업 예약: atexit(2) func : 종료시 수행할 작업을 지정한 함수명 프로그램 종료: _exit(2) 일반적으로 프로그램에서 직접 사용하지 않고 exit 함수 내부적으로 호출 #include <stdlib.h> void exit(int status); #include <stdlib.h> int atexit(void (*func)(void)); #include <unistd.h> void _exit(int status);

프로세스 종료 함수[2] 프로그램 종료 함수의 일반적 종료 절차 모든 파일 기술자를 닫는다. 부모 프로세스에 종료 상태를 알린다. 자식 프로세스들에 SIGHUP 시그널을 보낸다. 부모 프로세스에 SIGCHLD 시그널을 보낸다. 프로세스간 통신에 사용한 자원을 반납한다.

좀비 프로세스 (zombie process) 참고자료 좀비 프로세스 (zombie process) 부모 프로세스가 wait를 수행하지 않고 있는 상태에서 자식이 종료 자식 프로세스의 종료를 부모 프로세스가 처리해주지 않으면 자식 프로세스는 좀비 프로세스가 된다. 좀비 프로세스는 CPU, Memory 등의 자원을 사용하지 않으나, 커널의 작업 리스트에는 존재한다. 고아 프로세스 (orphan process) 하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 먼저 종료 부모 프로세스가 수행 중인 자식 프로세스를 기다리지 않고 먼저 종료 init 프로세스 좀비와 고아 프로세스의 관리는 결국 시스템의 init 프로세스로 넘겨진다. init 프로세스가 새로운 부모가 된다.

실습 부모는 “I’m the parent, child has pid %d”, 자식은 “I’m the child\n”를 출력하는 프로그램을 작성하라 두 개의 부 프로세스를 생성하고, 생성된 각각의 부 프로세스들은 그 자 신의 부 프로세스를 하나씩 또 생성하는 프로그램을 작성하라. 각 fork가 끝난 다음, 각 프로세스들은 자신과 부모프로세스들의 식별번호를 출력 한다 부모는 ‘A’에서 ‘Z’까지 대문자를 자식은 소문자를 표준 출력하는 프로그 램을 작성하라

[예제 6-3] exit, atexit 함수 사용하기 ex6_3.c 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 void cleanup1(void) { 05 printf("Cleanup 1 is called.\n"); 06 } 07 08 void cleanup2(void) { 09 printf("Cleanup 2 is called.\n"); 10 } 11 12 int main(void) { 13 atexit(cleanup1); 14 atexit(cleanup2); 15 16 exit(0); 17 } 종료시 수행할 함수 지정 지정한 순서의 역순으로 실행(실행결과 확인) # ex6_3.out Cleanup 2 is called. Cleanup 1 is called.

exec 함수군 활용 exec 함수군 exec 함수군의 형태 6가지 path : 명령의 경로 지정 file : 실행 파일명 지정 arg#, argv : main 함수에 전달할 인자 지정 envp : main 함수에 전달할 환경변수 지정 함수의 형태에 따라 NULL 값 지정에 주의해야 한다. #include <unistd.h> int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0); int execv(const char *path, char *const argv[]); int execle(const char *path, const char *arg0, ..., const char *argn, (char *)0, char *const envp[]); int execve(const char *path, char *const argv[], char *const envp[]); int execlp(const char *file, const char *arg0, ..., const char *argn, int execvp(const char *file, char *const argv[]);

[예제 6-4] execlp 함수 사용하기 (test3.c) 01 #include <unistd.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 printf("--> Before exec function\n"); 07 08 if (execlp("ls", "ls", "-a", (char *)NULL) == -1) { 09 perror("execlp"); 10 exit(1); 11 } 12 13 printf("--> After exec function\n"); 14 15 return 0; 16 } 인자의 끝을 표시하는 NULL 포인터 첫 인자는 관례적으로 실행파일명 지정 메모리 이미지가 ‘ls’ 명령으로 바뀌어 13행은 실행안됨 # ex6_4.out --> Before exec function . ex6_1.c ex6_3.c ex6_4.out .. ex6_2.c ex6_4.c han.txt

[예제 6-5] execv 함수 사용하기(test4.c) 01 #include <unistd.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 char *argv[3]; 07 08 printf("Before exec function\n"); 09 10 argv[0] = "ls"; 11 argv[1] = "-a"; 12 argv[2] = NULL; 13 if (execv("/usr/bin/ls", argv) == -1) { 14 perror("execv"); 15 exit(1); 16 } 17 18 printf("After exec function\n"); 19 20 return 0; 21 } 첫 인자는 관례적으로 실행파일명 지정 인자의 끝을 표시하는 NULL 포인터 경로로 명령 지정 역시 실행안 됨 # ex6_5.out --> Before exec function . ex6_1.c ex6_3.c ex6_5.c han.txt .. ex6_2.c ex6_4.c ex6_5.out

[예제 6-6] execve 함수 사용하기(test5.c) ... 05 int main(void) { 06 char *argv[3]; 07 char *envp[2]; 08 09 printf("Before exec function\n"); 10 11 argv[0] = "arg.out"; 12 argv[1] = "100"; 13 argv[2] = NULL; 14 15 envp[0] = "MYENV=hanbit"; 16 envp[1] = NULL; 17 18 if (execve("./arg.out", argv, envp) == -1) { 19 perror("execve"); 20 exit(1); 21 } 22 23 printf("After exec function\n"); 24 25 return 0; 26 } 실행파일명 지정 인자의 끝을 표시하는 NULL 포인터 환경변수 설정 ex6_6_arg.c를 컴파일하여 생성 # ex6_6.out --> Before exec function --> In ex6_6_arg.c Main argc = 2 argv[0] = arg.out argv[1] = 100 MYENV=hanbit

[예제 6-6] (2) arg.c 파일 (arg.out) 01 #include <stdio.h> 02 03 int main(int argc, char **argv, char **envp) { 04 int n; 05 char **env; 06 07 printf("\n--> In ex6_6_arg.c Main\n"); 08 printf("argc = %d\n", argc); 09 for (n = 0; n < argc; n++) 10 printf("argv[%d] = %s\n", n, argv[n]); 11 12 env = envp; 13 while (*env) { 14 printf("%s\n", *env); 15 env++; 16 } 17 18 return 0; 19 } 인자 값 출력 환경변수 출력

실습 “반복문을 사용해 1~10000까지 더하면서 결과값을 반복적으로 출력하 는 프로그램을 작성하고, 이 프로그램의 실행시간을 측정하는” 프로그램 을 exec를 사용하여 수행하라