본문 바로가기

CS/유닉스프로그래밍

(16)
유닉스 프로세스 * 메모리 레이아웃 * getpid, getppid 시스템콜 #include pid_t getpid(void); // returns : the process ID of the calling process pid_t getppid(void); // returns : the parent process ID of the calling process * fork 시스템콜 #include pid_t fork(void) ; // returns : 0 in child, process ID of child in parent, -1 on error * exec family #include int execl (const char *pathname, const char *arg0, ... /*NULL*/); int..
14. 유닉스 - 소켓 Internet model (TCP/IP protocol suite) 소켓은 tcp ip를 사용하기 위한 인터페이스 툴임 네트워크는 osi 7계층 하드웨어레이어, 데이터링크계층, 네트워크계층, 전송계층, 세션계층, 표현계층, 응용계층 tcp ip에서는 전송계층 위에 응용계층 하나만 있음 응용 계층에서 프로세스가 돌아감 그 밑에 전송계층에 tcp 프로토콜 udp 프로토콜 이 있고 그 밑에 ip프로토콜이 있고 그 밑에 데이터링크 레이어에 이더넷 토큰링 토큰버스 이렇게 있음 보통 이더넷을 사용함 우리는 컴퓨터에서 돌아가는 여러 개의 프로세스가 있는데 그 중에서 한 개의 프로세스로 인터넷에 연결된 원격진행이 되는 여러개의 프로세스 중에서 한 개의 프로세스와 소통하기를 원함 내 프로세스가 왼쪽이고 통신할 컴퓨터의..
13. 유닉스 IPC - semaphore, shared memory The semop(2) system call #include int semop(int semid, struct sembuf semoparray[], size_t nops); // returns : 0 if ok, -1 on error semop 세마포어의 오퍼레이션 인데 두개가 있음 wait(p) signal(v) 이 두 개의 오퍼레이션을 semop이라는 시스템콜로 구현을 함 첫번째 semid가 가리키는 세마포어 set이 있고 그 안에 세마포어가 여러 개 있음 semop 함수는 atomic함 id로 가리키는 세마포어 set에 여러 개 sem이 있는데 각 sem에 대해서 wait나 signal 오퍼레이션 수행하는데 그게 여러개 있음. 그것들을 각각 atomic 하게 실행함 wait - signal 세마포어..
12. 유닉스 IPC - message queue, semaphore Message Queue 메시지 큐는 파이프하고 비슷한 건데, 파이프처럼 데이터를 주고받을 수 있음 다른 프로세스로 메시지를 send 하거나 다른 프로세스로부터 메시지를 receive 하도록 허용해주는 ipc라 하는 거임 파이프는 bytestream으로 데이터를 주고 받음 데이터의 경계가 없음 메시지와 메시지 간 경계가 없음 메시지 큐로 데이터를 주고받을 때에는 단위가 메시지라는 단위로 주고받아서 메시지간 분명한 경계가 있음 그리고 그것을 메시지들을 구분해서 커널에서 저장할 때, 그걸 링크드 리스트 형태로 커널에서 저장함 struct msqid_ds {/* */ struct ipc_perm msg_perm; /* see ch08_ipc1-p.29 */ struct msg*msg_first; /* ptr ..
11. 유닉스 IPC - IO multiplexing I/O multiplexing fifo 사용할때는 fifo 하나를 두고 서버 rcv 있고 send 가 여러개 있음 fifo를 보내면 여러개 프로세스 간에 interleaving은 안됨. pipe 에서는 안됨, 그래서 하나가 보내면 순서 관계는 잘 맞춰짐 그래서 동시에 보내더라도 먼저 도착하는게 순서대로 들어옴 그럼 receive는 하나씩 가져오면 됨. 근데 문제는 통신 채널이 하나임. 이 통신채널이 client가 여러개 있고 receive 할때 서버가 채널이 각각 데이터를 통신하는 채널이 각각 다른 여러개가 있을때 이걸 어떻게 manage하느냐 이거임. 이게 돌다가 하나가 비어있어서 block 되면 다른 쪽을 보지를 못함 이런 문제가 있어서 이런 경우 어떻게 처리하느냐가 io multiplexing 임 ..
10. 유닉스 IPC - PIPE, FIFO PIPE 프로그램을 작성하는데, 그 프로그램이 한 가지만 잘하는 프로그램을 짜자는 거 한 가지만 잘하는 프로그램을 여러개 만들어서 묶어서 함께 일할 수 있게 하자는 거 그게 가능하려면 프로세스간 커뮤니케이션이 되어야 함 IPC IPC의 대표적인 방법이 파이프 시그널을 통해서도 커뮤니케이션할 수 있는데, 데이터도 주고받고 하기 힘듦 PIPE로 데이터를 주고 받을 수 있는 텍스트 데이터 스트림 채널을 제공함 파이프는 제일 오래된 유닉스의 IPC form이고 가장 간단함 파이프도 file로 간주됨, special file로 표현됨 open하지는 않고 read write를 함 who는 시스템 내에 어떤 유저가 있는지, 유저네임을 출력하는 프로그램임 그 출력을 temp 파일에 write함 wc는 word coun..
9. 유닉스 시그널 프로세싱 - 2 The sigaction(2) system call #include int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact); // returns : 0 if ok, -1 on error sigaction argument에는 signo, act, oact가 있음 act는 action을 어떻게 modify할지, oact는 오래된 버전 struct sigaction 구조체 멤버에는 네 개가 있음 struct sigaction{ void (*sa_handler) (int); sigset_t sa_mask; int sa_flags; void(*sa_sigaction) (int, siginfo_t *..
8. 유닉스 시그널 프로세싱 - 1 시그널은 소프트웨어 인터럽트임, 다른 프로세스에게 시그널을 보낼 수 있음 시그널을 받으면 그에 대한 액션을 하게 됨 대부분의 non trivial process는 시그널을 처리할 필요가 있음 비동기적 사건을 처리할 수 있는 방법을 시그널이 제시해줌 시그널 개념 $ cc verybigprog.c 아주 큰 프로그램이라서 오랫동안 돌리는 동안 에러가 많이 뜰 건데, 에러가 뜨면 계속 돌릴 필요 없음. foreground로 돌려서 중지시키기 위해서 ^C를 하거나 인터럽트 키를 누르면 됨 에러를 고쳐서 다시 돌리면 되고, 여기서 시그널이 발생함 ^C를 하면 커널이 응답을 해서 foreground에서 도는 모든 프로그램에게 SIGINT를 보냄 커널 프로세스가 foreground에 SIGINT를 보냈을 때 cc가 돌..