/***************************************
* Filename: fork_test.c
* Title: Process Management
* Desc: Create the child process using execl
* ***************************************/
#include <stdio.h>
#include <stdlib.h> // for system()
#include <unistd.h> // for execl(), fork()
#include <wait.h> // for wait()
// 온라인 매뉴얼 "http://man7.org"
int main(int argc, char *argv[])
{
int pid;
/* fork another process */
pid = fork(); // sys call
if(pid < 0) { /* error occurred */
fprintf(stderr,"Fork Failed");
exit(-1);
} else if (pid == 0) { /* child process */
//execl("/bin/ls", "ls", NULL);
//execl("/bin/ps", "ps", "aux", NULL);
printf("Child here!\n");
for(;;) sleep(1);
exit(0);
} else { /* parent process */
wait(NULL);
printf("Child Complete!\n");
exit(0);
}
}
// fork는 코드 복제함수, 복제된 코드는 fork(); 아랫줄부터 실행(연쇄x)
// 자식 프로세스와 부모 프로세스의 pid가 다르다. 자식은 0, 부모는 양수
systemcall(syscall) : kernal 에게 명령을 요청하는 interface 역할
syscall : kernal을 부르는 행위
//user 영역 : fork() - clone() - //kernal 영역 :
do_fork() - copy_process()
printf - systemcall / strcpy - systemcall 아님
pid (process id) = fork( ) : clone process
복제 할 시 원본과 복제본의 주소값이 다른 곳에 저장
ppid (parent process id) : init 아담 프로세스 : 자기 부모 프로세스 죽으면 여기를 부모 프로세스로 인식
API : 프로그램은 여러가지 기능으로 구성되어있다
그 기능들을 각각 API라고 한다
큰 개념
fork( ) :
부모 - 복제 성공시 pid 값 양수 / 복제 실패시 pid 값 음수
자식 - 생성시 pid 값 0
자식이 종료되면 부모에게 signal보내게 되어있음 exit(value) value를 부모에게 보냄
부모가 대기 상태에 있을때 자식이 종료되면서 부모에게 signal 보내면 부모가 깨어난다
wait(NULL) 자식이 왜 죽었는지 몰라도 돼
wait(&status) 자식이 왜 죽었는지 SIGINT를 받아서 check
정상 종료 : 상위 8bit에 저장 0x00006 0000000
비정상 종료 : 하위 8bit에 저장 0x00000000 00000009
execl : 부모의 코드를 그대로 실행하지 않고, 자식의 execl에 들은 코드가 실행된다
bash는 항상 돌아가는데 자식을 만들어서 입력받은 코드에 해당하는 기술을 execl에 담아서 해당 코드에 맞는 기술 실행하는 구조
/bin : 기본 프로그램
/sbin : 기본 시스템 프로그램
/boot : 커널 이미지
/dev : 장치 파일 - tty(가상 하드웨어 콘솔) 들어있는 곳
/etc : 시스템 전체 구성
/home : 사용자 홈 디렉토리
/root : 루트 사용자 홈 디렉토리
/sys sysfs : 가상 파일 시스템의 마운트 지점
/tmp : 임시 파일
user@linux:~/Desktop/visiondata$ for f in *.jpg;do echo ${f} ${f%.jpg}.png; done # 확장자 바꾸기
user@linux:~/Desktop/visiondata$ for f in *.jpg;do mv ${f} ${f%.jpg}.png; done # 파일명 바꾸기
user@linux:~/Desktop/shell_cmd/mydir2$ if [ -f 'Gone With the Wind.mp3' ]; then echo "this is file"; else "this is not file"; fi # if else문으로 파일 유무 확인
this is file
user@linux:~/Desktop/shell_cmd/mydir2$ if [ -f 'Gone With the WInd.mp3' ]; then echo "this is file"; else "this is not file"; fi # if else문으로 파일 유무 확인
this is not file: command not found
user@linux:~/Desktop/shell_cmd$ read num # num 변수 입력받기
999
user@linux:~/Desktop/shell_cmd$ echo $num # num 변수 출력
999
리눅스쉘프로그래밍.pdf 에 많음... 참조
프로그램 실행방법 1)
user@linux:~/Desktop/shell_cmd$ vim test.sh
#!/bin/bash
// shebang or hash bang
read -p "How old are you? " old
echo your age is $old
user@linux:~/Desktop/shell_cmd$ chmod +x test.sh
user@linux:~/Desktop/shell_cmd$ ./test.sh
프로그램 실행방법 2)
user@linux:~/Desktop/shell_cmd$ bash test.sh
프로그램 실행방법 3)
user@linux:~/Desktop/shell_cmd$ . test.sh
user@linux:~/Desktop/shell_cmd$ echo "current path is $PWD"
current path is /home/user/Desktop/shell_cmd
user@linux:~/Desktop/shell_cmd$ echo "current path is 'pwd'"
current path is 'pwd' # 이건 안된거임
user@linux:~/Desktop/shell_cmd$ echo "current path is pwd
"
current path is /home/user/Desktop/shell_cmd
user@linux:~/Desktop/shell_cmd$ animal=tiger
user@linux:~/Desktop/shell_cmd$ animal= echo $animal
tiger # tiger 가 나온 이유는 echo $animal이 먼저 실행되었기 때문
user@linux:~/Desktop/shell_cmd/mydir2$ touch "The old man and the sea.mp3"
user@linux:~/Desktop/shell_cmd/mydir2$ book="The old man and the sea.mp3"
user@linux:~/Desktop/shell_cmd/mydir2$ rm "$book"
프롬프트 상태 바꾸기
user@linux:~/Desktop/shell_cmd$ PS1='james$ '
james$ fdfsa
fdfsa: command not found
james$ PS1='sunshine0070$ '
sunshine0070$ hi
원상복구
grep PS1 ~/.bashrc
PS1='{debian_chroot:+(debian_chroot)}\u@\h:\w$ '
user@linux:~/Desktop/shell_cmd$ echo ${#file}
9 # 파일명 길이
user@linux:~/Desktop/shell_cmd$ file="scale.2019.png" 인 경우
user@linux:~/Desktop/shell_cmd$ echo {file##*.} png # .앞은 *(와일드카드)로 넓게 지움 user@linux:~/Desktop/shell_cmd echo ${file%%.}
scale # .뒤는 (와일드카드)로 넓게 지움
파일명 길이로 찾기
user@linux:~$ cd /
user@linux:/$ echo ???
bin dev etc lib mnt opt run srv sys tmp usr var
user@linux:/$ echo ?????
cdrom media
디렉토리에서 c, h로 끝나는 파일 찾기
1) user@linux:~/Desktop$ cd kernel-mds2450-3.0.22/drivers/char/
user@linux:~/Desktop/kernel-mds2450-3.0.22/drivers/char$ ls *.[ch]
2) 커널에 c, h로 끝나는 파일 모두 찾기
user@linux:~/Desktop/kernel-mds2450-3.0.22$ find . -iname '*.[ch]'
user@linux:~/Desktop/shell_cmd$ grep "George.*Washington" president.txt
user@linux:~/Desktop/shell_cmd$ grep -o 'George.*' president.txt