셸 : 사용자의 명령을 받아들인 후 필요한 프로그램을 호출하여 실행되게끔 하는 것으로 명령어 해석기라 부르기도 한다.
리눅스 프롬프트에서 ls와 같은 명령을 입력하고 Enter키를 누르면 ls 명령어가 실행되고 프롬프트가 생기는데
이러한 역할을 담당하는 것이 셸이다.
프롬프트란 시스템이 다음 명령이나 메시지 , 다른 사용자의 행동을 받아들일 준비가 되었음을 사용자에게 알려 주는 메시지이다.
밑에 소스에서 printf문으로 출력되는 myshell: 이 프롬프트라 할 수 있다.
s = strtok_r(buf,dekin, &save);
while(s)
{
arg[argv++] = s;
s= strtok(NULL,delim,&save);
}
strtok_r(buf,delim,&save)는 buf에 저장된 문자열에서 delim에서 설정된 문자가 나오면 단어로 자르는
함수이다.
buf에 저장된 내용이 ls -al이라고 할때 arg[0]에는 ls가 저장되고 arg[1]은 -al이 저장된다.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
시그널의 종류
시그널 처리하기
각 프로세스는 시그널과 관련해서 크게 세 가지 일을 한다.
첫째 시그널이 도착했을 때 그에 대한 응답을 한다.
응답에 대한 세 가지 방법
① 시스템에서 기본적으로 설정한 동작
② 시그널을 무시한다. 단 SIGKILL과 SIGSTOP 시그널은 무시할 수 없다.
③ 특정 루틴(함수)을 실행
둘째 시그널이 도착했을 때 시그널을 블록화한다.
중요요한 부분을 실행하고 있을 때 시그널이 도착하면 이를 블록화해 뒤로 미룰 수가 있는데 블록을 해제하면
블록화되었던 시그널이 전달된다.
셋째 프로세스에 시그널을 보낸다.
kill,raise와 같은 함수를 이용하여 다른 또는 자기 자신의 프로세스에 시그널을 보낼 수 있다.
관련함수
void (*signal(int signum, void (*sighandler)(int)))(int);
int sigaction(int signum , const struct sigaction *act , struct sigaction *oldact);
sleep 함수
sleep함수는 seconds초 동안 정지하며 함수 호출 후 seconds가 지나거나 시그널을 받으면 블록에서
깨어난다.
기능 : 일정 시간 동안 정지한다. 기본형 : unsigned int sleep(unsigned int seconds); seconds : 정지할 시강로 단위는 초 반환값 : 성공 : 남은시간 헤더파일 : <unistd.h> |
반환값이 남은 시간이며 , 시간이 경과되면 0이 반환되고 다른 시그널에 의해 중간에 깨어나면 남아있는
시간을 반환한다.
SIGINT(시그널)
ctrl + c는 실행화면에서 SIGINT 시그널을 보내 프로세스를 종료시키는 동작키이다.
signal 함수
시그널을 받았을 때 종료되지 않고 무시하거나 특정 함수가 실행되도록 할 수 있는 함수이다.
기능 : 시그널 처리를 설정한다. 기본형 : void (*signal(int signum,void(*sighandler)(int)))(int); signum : 시그널 번호 sighandler : 설정할 시그널 핸들러 반환값 : 성공 : 이전의 시그널 핸들러 포인터 실패 : -1(SIG_ERR) 헤더파일 : signal.h |
signal함수를 호출하면 signum 시그널을 받게되고 sighandler에 설정한 일을 하게된다.
sighandler 인수로는 동작할 함수 이름, SIG_IGN , SIG_DFL이 있다.
시그널 핸들러의 세가지 유형
시그널 핸들러 |
의미 |
함수 이름 |
시그널을 받으면 "함수이름" 함수가 실행된다. |
SIG_IGN |
시그널을 받으면 무시한다. |
SIG_DFL |
시그널을 받으면 시스템에서 기본적으로 설정한 동작을 한다. |
EX)
9번 라인에서 SIGINT 시그널신호가 오면 signalHandler함수를 실행 하도록 설정
SIGINT 시그널을 받아 signalHandler 함수가 실행되면
20번 라인의 signal에 의해 SIGINT를 다시 설정되고 SIGINT 시그널을 받으면 종료하게 된다.
함수의 타입찾기
4월 1일 필기참조
///////////////////////////////////////////////////////////////////////////////////////
다수의 클라이언트와의 네트워킹
6월17일에 작성한 서버/클라이언트는 1:1 통신이라 서버에서 한명만 통신이 가능했다.
1:1에서는 서버가 직접 클라이언트와 연결을 했지만 다수의 클라이언트와 연결을 하기위해서는 fork함수를
이용하면된다.
fork함수를 사용하면 서버와 동일한 자식프로세스가 생성되고 이 자식프로세스와 접속을 요청한 클라이언트와
연결을 시켜주면 통신을 할 수 있다.
그러면 서버는 또 다른 클라이언트의 요청을 받아들이고 다시 자식프로세스를 생성하여 다른 클라이언트와
연결을 시켜주면 다중네트워킹이 가능해진다.
다중 네트워크 소스
서버
클라이언트
결과
일대일 채팅 프로그램
동작과정
① 서버는 socket으로 servsockfd 소켓을 생성하고 bind 로 주소 정보를 연결한다.
② 클라이언트가 sockfd 소켓을 생성하고 connect에 의해 서버에게 통신을 요청한다.
③ 서버가 accept로 요청을 받아들이고 새로운 소켓인 clntSockfd를 통해 클라이언트와 연결한다.
④ 서버와 클라이언트 모두 자식 프로세스를 생성한다.
⑤ 서버의 자식 프로세스는 servSpclfd 소켓의 연결을 끊는다.
⑥ 서버와 클라이언트의 부모 프로세스는 터미널로 입력되는 데이터를 읽어 상대방에게 보내고
자식 프로세스는 데이터를 받아 터미널에 출력한다.
⑦ 이러한 동작을 반복하다가 클라이언트의 터미널로 입력되는 애용이 quit면 클라이언트의 부모 프로세스는
자식 프로세스에게 SIGINT 시그널을 보내 종료시키고 자신도 종료한다.
⑧ 다시 서버는 또 다른 클라이언트와의 일대일 채팅을 기다린다.
소스파일(리눅스용)
서버
클라이언트
실행화면
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
20140626양태영 수업보고서(출석번호 16번) (9) | 2014.06.26 |
---|---|
20140625손병규_수업정리(출석번호 14번) (8) | 2014.06.25 |
21040624서상우수업보고서 (14) | 2014.06.24 |
20140623 박영주 일일보고서 (12) | 2014.06.23 |
20140619 업무일지 김화린[출석번호10번] (11) | 2014.06.19 |
USB3.0 32기가 공구 진행합니다~ (6) | 2014.06.19 |
2014년 06월 18일 출석번호 9번 김해성 일일업무일지 (12) | 2014.06.18 |
20140617 업무보고 김진철 출석번호 8번 (13) | 2014.06.18 |