6주차-LINUX(4)
fork() 함수
/***************************************
* 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에 담아서 해당 코드에 맞는 기술 실행하는 구조
리눅스 커널
- tar zxf ~/Documents/MDS2450/kernel-mds2450-3.0.22-20140730.tar.gz
- cd kernel-mds2450-3.0.22/
- make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4 uImage
- cp arch/arm/boot/uImage /tftpboot/uImage-m2450
<커널 환경 설정> - make ARCH=arm menuconfig
- enter : 들어가기
space bar : 설정 바꾸기
esc 2번 : 나가기
리눅스 최상위 디렉토리
/bin : 기본 프로그램
/sbin : 기본 시스템 프로그램
/boot : 커널 이미지
/dev : 장치 파일 - tty(가상 하드웨어 콘솔) 들어있는 곳
/etc : 시스템 전체 구성
/home : 사용자 홈 디렉토리
/root : 루트 사용자 홈 디렉토리
/sys sysfs : 가상 파일 시스템의 마운트 지점
/tmp : 임시 파일
- C:\Program Files\MATLAB\R2016a\toolbox\vision 에서 visiondata 파일 리눅스 desktop에 옮기기 (압축 이용)
- git clone https://github.com/guileschool/shell_cmd.git
쉘 스크립트 언어
-
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$ echo '"say, say, say"'
"say, say, say"
-
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$ file="scale.png"
user@linux:~/Desktop/shell_cmd$ echo {file:6} png # 몇자 인지 알수 없으면 불가 user@linux:~/Desktop/shell_cmd echo {file#*.} png # .앞은 *(와일드카드)로 지움 user@linux:~/Desktop/shell_cmd echo ${file%.}
scale # .뒤는 (와일드카드)로 지움
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]'
- grep, * 응용
user@linux:~/Desktop/shell_cmd$ grep "George.*Washington" president.txt
user@linux:~/Desktop/shell_cmd$ grep -o 'George.*' president.txt
Author And Source
이 문제에 관하여(6주차-LINUX(4)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sunshine0070/6주차-LINUX4저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)