6주차-LINUX(4)

11361 단어 리눅스리눅스

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에 담아서 해당 코드에 맞는 기술 실행하는 구조


리눅스 커널

  1. tar zxf ~/Documents/MDS2450/kernel-mds2450-3.0.22-20140730.tar.gz
  2. cd kernel-mds2450-3.0.22/
  3. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4 uImage
  4. cp arch/arm/boot/uImage /tftpboot/uImage-m2450
    <커널 환경 설정>
  5. make ARCH=arm menuconfig
  6. enter : 들어가기
    space bar : 설정 바꾸기
    esc 2번 : 나가기

리눅스 최상위 디렉토리

/bin : 기본 프로그램
/sbin : 기본 시스템 프로그램
/boot : 커널 이미지
/dev : 장치 파일 - tty(가상 하드웨어 콘솔) 들어있는 곳
/etc : 시스템 전체 구성
/home : 사용자 홈 디렉토리
/root : 루트 사용자 홈 디렉토리
/sys sysfs : 가상 파일 시스템의 마운트 지점
/tmp : 임시 파일



쉘 스크립트 언어

  1. user@linux:~/Desktop/visiondata$ for f in *.jpg;do echo ${f} ${f%.jpg}.png; done # 확장자 바꾸기

  2. user@linux:~/Desktop/visiondata$ for f in *.jpg;do mv ${f} ${f%.jpg}.png; done # 파일명 바꾸기

  3. 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

  4. 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

  5. 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

  1. 메타문자 기능 \, $, ` 은 " " 안에 살아있음

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

  1. " " 인용문으로도 출력하고 싶을 때
    user@linux:~/Desktop/shell_cmd$ echo '"say, say, say"'
    "say, say, say"
  1. user@linux:~/Desktop/shell_cmd$ animal=tiger
    user@linux:~/Desktop/shell_cmd$ animal= echo $animal
    tiger # tiger 가 나온 이유는 echo $animal이 먼저 실행되었기 때문

  2. 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"

  3. 프롬프트 상태 바꾸기
    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$ '

  1. 확장자 추출
    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 # .뒤는
(와일드카드)로 넓게 지움

  1. 파일명 길이로 찾기
    user@linux:~$ cd /
    user@linux:/$ echo ???
    bin dev etc lib mnt opt run srv sys tmp usr var
    user@linux:/$ echo ?????
    cdrom media

  2. 디렉토리에서 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]'

  1. grep, * 응용

user@linux:~/Desktop/shell_cmd$ grep "George.*Washington" president.txt

user@linux:~/Desktop/shell_cmd$ grep -o 'George.*' president.txt

좋은 웹페이지 즐겨찾기