※a.dat파일을 Hexaview로 뿌리면 little endian으로 들어 가 있는 값들이 보인다. 여기서 40147EC0는 Next 포인터의 값인데 의미가 없어서 쓰레기값이다. 총41바이트가 사용되는데 1바이트는 개행문자‘\n'이기 때문에 40바이트를 사용한다고 보면된다.
#define CLCD_RS (1<<8)//0x100 #define CLCD_RW (1<<9)//0x200 #define CLCD_EN (1<<10)//0x400 #define CLCD_BS (0xFF<<16)//0xFF0000 #define CLCD_INST_CD (0x01<<16) //Clear Display #define CLCD_DELAY for(icount =0; icount < 1000000;icount++) void OUT_INIT(void)
{ // Configure the pin in output 핀들은 ARM에 내보내는 출력용으로 사용
PIOA_OER = CLCD_BS |CLCD_EN|CLCD_RS|CLCD_RW; // Set the PIO controller in PIO mode instead of peripheral mode 핀사용을 할것인가 말것인가
PIOA_PER = CLCD_BS |CLCD_EN|CLCD_RS|CLCD_RW; // Disable pull-up 풀업을 off
PIOA_PPUDR = CLCD_BS |CLCD_EN|CLCD_RS|CLCD_RW;
}
int main(void)
{ volatileunsignedint icount;
OUT_INIT();
PIOA_CODR =CLCD_EN; //LCD 비활성화
PIOA_CODR = CLCD_RS; //명령 레지스터를 선택
PIOA_CODR = CLCD_RW; //write선택
CLCD_DELAY; //최소 40ns 시간 지연
PIOA_SODR = CLCD_EN; //LCD 활성화
CLCD_DELAY; //최소 230ns 의 시간 지연
PIOA_SODR = CLCD_INST_CD; //bus에 화면을 지우라는 명령이 들어간다.
PIOA_CODR =CLCD_EN; //다시 LCD 비활성화
CLCD_DELAY;
while(1); return 0;
}
※delay 40ns는tsu1은 쓰기위해서 최소한 40ns 이상의 시간을 기다린다.
※delay 230ns유지는 Enable이 high에서 최소 230ns(nano second)를 유지해야된다.
◎Network
◇fork()
프로세스가 fork 함수를 만나면 현재 실행 중인 프로세스의 이미지를 그대로 복사해서 새로운 프로세스를 만든다. 프로세스의 이미지를 복사한다는 의미는 프로세스의 코드 부분은 물론, 전역변수, 지역변수 등 모든 실행 환경을 그대로 복사하는 것을 말한다. 이때 새로 생성된 프로세스를 자식 프로세스라 하고, fork 함수를 호출해서 자식 프로세스를 생성하는 프로세스를 부모 프로세스라고 한다.
부모와 자식 프로세스 간에 유일하게 다른 부분이 있다면 fork 함수를 호출하고 그 결과를 반환 받는 변수이다.
pid_t pid
pid = fork(void);
fork 함수가 복사하는 이미지에는 변수 pid도 포함된다. 그런데 fork 함수의 반환 값은 부모 프로세스와 자식 프로세스가 서로 다르다. 그래서 부모 프로세스의 변수 pid에는 자식 프로세스의 식별자가 저장되고, 자식 프로세스의 변수 pid에는 0이 저장된다.
하나의 프로그램으로 부모 프로세스와 자식 프로세스의 역할을 모두 구현해야한다. 때문에 프로세스에서 fork 함수를 호출한 후 반환되는 값을 보고 현재 프로세스가 부모 프로세스의 역할을 해야 하는지, 자식 프로세스의 역할을 해야 하는지를 구분하는 코딩이 필요하다.
pid_t pid;
pid = fork();
if(pid >0)
{
//부모 프로세스가 실행하는 코드
}
=====================================
else if(pid == 0)
{
//자식 프로세스가 실행하는 코드
}
=====================================
else if(pid == -1)
{
//오류 발생에 대비하는 코드
}
=====================================
※fork()는 부모와 자식 메모리 공간은 별개로 존재한다. 데이터가 들어 있는 메모리 공간만 복사된다.
※getppid()는 부모 프로세서pid를 알고 싶을 때 사용(현재 실행중인 프로세스의 부모 pid)
※실행파일의 프로세스 상태를 보려면 ‘파일명 &ps -u’ 명령을 실행한다.
☆./fork_test &ps -u 명령 사용
※STAT에서 Z는 좀비 프로세서이다. 좀비 프로세서는 자식프로세서에서 발생.
♧좀비 프로세스
- 프로세스 종료 후 메모리상에서 사라지지 않은 프로세스
♧좀비 프로세스 생성 이유
- 자식 프로세스가 종료하면서 반환된 값 0을 커널이 부모 프로세스에 전달한 후 자식 프로세스를 소멸시킴. - 반환값을 부모 프로세스에 전달하지 못한 경우 자식 프로세스는 좀비로 존재.
- 부모 프로세스가 커널에게 종료된 자식 프로세스의 리턴값을 전달 요청을 해야만 커널이 리턴값 전달 가능함
♧종료된 자식 프로세스의 리턴값 요청 함수
-wait함수
※성공시 종료된 자식 프로세스 ID, 실패시 -1 리턴
- status : 포인터 status가 가리키는 변수에 자식 프로세스 종료시 리턴하거나 exit 함수 호출시 전달한 인자값이 저장됨
- 매크로함수 WEXITSTATUS(status)로 종료시 리턴값이나 exit() 인자로 넘겨진 값 확인
- 호출 시점에 종료된 자식 프로세스가 없으면 blocking 상태에 빠짐