-
p8-1.c Parent process๋ ์ธ ๊ฐ์ child process๋ฅผ ๋ง๋ค๊ณ , 1์ด ๊ฐ๊ฒฉ์ผ๋ก ๊ฐ child process์๊ฒ SIGUSR1 signal์ ๋ณด๋ธ ํ, child process๋ค์ด ์ข ๋ฃ ํ ๋๊น์ง ๋๊ธฐ ํ์๋ค๊ฐ, ์ข ๋ฃํ child process์ id์ exit status๋ฅผ ์ถ๋ ฅ ํ ์ข ๋ฃ ํฉ๋๋ค. ๊ฐ child process๋ ์์ฑ ํ parent๋ก๋ถํฐ signal์ด ์ฌ ๋๊น์ง ๋๊ธฐ ํ์๋ค๊ฐ (pause() ์ฌ์ฉ), signal์ ๋ฐ์ผ๋ฉด ์์ ์ process id๋ฅผ ์ธ ๋ฒ ์ถ๋ ฅ ํ ํ ์ข ๋ฃ ํฉ๋๋ค. ์ด์ ๊ฐ์ด ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ ํ์์ค.
#define BUFSIZE 512 void catchusr(int); void do_child(int i){ int pid; static struct sigaction act; act.sa_handler = catchusr; sigaction(SIGUSR1, &act, NULL); printf("%d-th child is created...\n", i); pause(); pid = getpid(); for(i=0;i<3;i++){ printf("[child process id] : %d ...\n", getpid()); } exit(0); } void catchusr(int signo){ printf(".....catch SIGUSR1 = %d\n", signo); } int main(int argc, char **argv){ int i, k, status; pid_t pid[3]; for(i=0;i<3;i++){ pid[i] =fork(); if(pid[i] == 0){ do_child(i); } } for(i=0;i<3;i++){ sleep(1); kill(pid[i], SIGUSR1); } for(i=0;i<3;i++){ k = wait(&status); printf("child #%d is terminated...%d\n", k, WEXITSTATUS(status)); } exit(0); }
-
P8-2.c Parent process๋ ๋ค์ฏ ๊ฐ์ child process๋ค์ ๋ง๋ค๊ณ , ๋๊ธฐํ์๋ค๊ฐ child process๊ฐ ๋ชจ๋ ์ข ๋ฃ ํ ํ ์ข ๋ฃ ํฉ๋๋ค. ๊ฐ child process๋ ์์ ์ ์์๊ฐ ๋ ๋๊น์ง ๋๊ธฐ ํ์๋ค๊ฐ, 1์ด์ฉ ์ฌ๋ฉด์ (sleep (1); ์ฌ์ฉ) ์์ ์ process id(getpid(); ์ฌ์ฉ)๋ฅผ 5ํ ์ถ๋ ฅํ๋ ์์ ์ ํ ํ ์ข ๋ฃ ํฉ๋๋ค. child process์ id ์ธจ๋ ฅ ์์๋ ์์ฑ ์์์ ์ญ์์ด๋ฉฐ, ์ด์ ๊ฐ์ ์์ ๋๊ธฐํ ์์ ์ signal์ ๋ณด๋ด์ ์งํ ํฉ๋๋ค.
- ์์ฑ ์์์ ์ญ์์ผ๋ก ์์ ์ํํด์ผํ๋๊น, ์ฒซ ๋ฒ์งธ๋ก ๋ง๋ค์ด์ง child ์ด์ธ์ child๋ค์ pause๋ก ๊ธฐ๋ค๋ฆผ
void catchusr(int); void do_child(int i, int *pid_array){ int j, pid; static struct sigaction act; act.sa_handler = catchusr; sigaction(SIGUSR1, &act, NULL); printf("%d-th child is created ... pid = %d\n", i, getpid()); //์์ฑ ์์์ ์ญ์์ผ๋ก ์์ ์ํํด์ผํ๋๊น, ์ฒซ ๋ฒ์งธ๋ก ๋ง๋ค์ด์ง child ์ด์ธ์ child๋ค์ pause๋ก ๊ธฐ๋ค๋ฆผ if(i<4) pause(); pid = getpid(); for(j=0;j<5;j++){ printf("[child process id] : %d ...\n", getpid()); sleep(1); } if(i>0){ kill(pid_array[i-1], SIGUSR1); } exit(0); } void catchusr(int signo){ printf(".....catch SIGUSR1 = %d\n", signo); } int main(int argc, char **argv){ int i, status; pid_t pid[5]; for(i=0;i<5;i++){ pid[i] =fork(); if(pid[i] == 0){ do_child(i, pid); } } for(i=0;i<5;i++){ wait(&status); } exit(0); }
-
P8-3.c 10๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๊ทธ ํฉ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑ ํฉ๋๋ค. ๋จ, 10์ด๊ฐ ์ฌ์ฉ์๋ก๋ถํฐ ์ ์ ๋ ฅ์ด ์์ผ๋ฉด, ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ๋ค์ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #define BUFSIZE 512 void catchalarm(int); int main(int argc, char **argv){ int i, num, sum = 0; static struct sigaction act; act.sa_handler = catchalarm; sigaction(SIGALRM, &act, NULL); for(i=0;i<10;i++){ do{ alarm(10); }while(scanf("%d", &num) < 0); alarm(0); sum += num; printf("sum = %d\n", sum); } exit(0); } void catchalarm(int signo){ printf("[Warning]No input for 10 seconds ... %d\n", signo); }
-
์๊ฒฉ ์๋ฒ์ ๋๋ ํ ๋ฆฌ ๋ก์ปฌ์ ์ ์ฅ. scp ๋ช ๋ น
- -r ์ต์ ์ฃผ๋ฉด ๋๋ ํ ๋ฆฌ ๋ณต์ฌ ๊ฐ๋ฅ
- -r ์ต์ ์ ์ฃผ๋ฉด ํ์ผ๋ง ๋ณต์ฌ ๊ฐ๋ฅ
$ scp -P 1074 -r s13011022@203.250.148.93:/home/account/class/tspark/s13011022 ./unix [์ฐธ๊ณ ] http://faq.hostway.co.kr/?mid=Linux_ETC&page=8&document_srl=1426 https://skylit.tistory.com/90
-
p9-1 ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ด์ฉํ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑ ํฉ๋๋ค.
-
(a) reader ํ๋ก๊ทธ๋จ์ โtemp" ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ ํ, scanf()๋ก 10๊ฐ์ ์ ์๋ฅผ ์ฝ์ด์ ๋งคํ๋ ํ์ผ์ ์ ์ฅํ๋ ์์ ์ 10ํ ์คํ ํฉ๋๋ค.
#define BUFSIZE 512 int main(int argc, char **argv){ int i, fd; int *addr; fd = open("temp", O_RDWR | O_CREAT, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ftruncate(fd, sizeof(int)*10); for(i=0;i<10;i++){ scanf("%d", addr+i); } exit(0); }
-
(b) writer ํ๋ก๊ทธ๋จ์ โtemp" ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ ํ, ๋งคํ๋ ํ์ผ์ ์๋ ์ ์๋ฅผ ์ถ๋ ฅํ๋ ์์ ์ 10ํ ์คํํฉ๋๋ค (printf() ์ฌ์ฉ). ๋จ, ์ถ๋ ฅ ํ๋ก๊ทธ๋จ์ 5์ด๊ฐ sleep() ํ ํ 5ํ์ ์ถ๋ ฅ ์์ ์ ์ฐ์ ์ง ํ ํ๊ณ ๋ค์ 5์ด๊ฐ sleep() ํ ํ 5ํ์ ์ถ๋ ฅ ์์ ์ ์งํ ํฉ๋๋ค.
#define BUFSIZE 512 int main(int argc, char **argv){ int i, j, fd; int *addr; fd = open("temp", O_RDWR | O_CREAT, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); //๊ตณ์ด sleepํด์ฃผ๋๊ฑด ๋๊ธฐํ ๋๋ฌธ์ sleep(5); for(i=0;i<10;i++){ sleep(5); for(j=0;j<5;j++){ printf("%d ", *(addr+i)); } printf("\n"); } exit(0); }
-
(c) ๋ ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ ์ข ๋ฃ ํ ํ โtemp" ํ์ผ์ ํฌ๊ธฐ๋ฅผ ํ์ธํฉ๋๋ค.
40์ผ๋ก ๋์ผ
-
-
P9-2 ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ด์ฉํ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑ ํฉ๋๋ค.
-
(a) reader ํ๋ก๊ทธ๋จ์ โtemp" ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ ํ, ์ธ๋ถ ์ ๋ ฅ์ ์ฝ์ด์ (read() ์์คํ ์ฝ ์ฌ์ฉ) ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์์ ์ 3ํ ์คํ ํฉ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #define BUFSIZE 512 int main(int argc, char **argv){ int i, fd, len = 0; char *addr; fd = open("temp", O_RDWR | O_CREAT, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ftruncate(fd, BUFSIZE); for(i=0;i<3;i++){ len = len + read(0, addr + len, BUFSIZE); printf("[read] : %d\n", len); if(len > BUFSIZE) break; } exit(0); }
-
(b) writer ํ๋ก๊ทธ๋จ์ โtemp" ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ ํ, ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ์์ ์ 3ํ ์คํํฉ๋๋ค (write() ์์คํ ์ฝ ์ฌ์ฉ). ๋จ. 3์ด๊ฐ sleep() ํ๋ฉด์ ์ถ๋ ฅ ์์ ์ ์งํํฉ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #define BUFSIZE 512 int main(int argc, char **argv){ int i, fd, len = 0; char *addr; fd = open("temp", O_RDWR | O_CREAT, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); printf("[test]%s\n", addr); for(i=0;i<3;i++){ sleep(3); len = len + write(1, addr + len, BUFSIZE); write(1, "-------\n", 8); if(len > BUFSIZE) break; } exit(0); }
-
-
p9-3.c Parent process๋ ์ธ ๊ฐ์ child process๋ค์ ๋ง๋ค๊ณ , ๋ชจ๋ child process๊ฐ ์ข ๋ฃ ํ ํ ์ข ๋ฃํฉ๋๋ค. ๊ฐ child process๋ ์์ ์ ์์๊ฐ ๋ ๋๊น์ง ๋๊ธฐ ํ์๋ค๊ฐ, 1์ด์ฉ ์ฌ๋ฉด์ ์์ ์ process id๋ฅผ 5 ํ ์ถ๋ ฅ ํ ํ ์ข ๋ฃํฉ๋๋ค. child process์ id ์ธจ๋ ฅ ์์๋ ์์ฑ ์์์ ์ญ์์ด๋ฉฐ, ์ด์ ๊ฐ์ ์์ ๋ ๊ธฐํ ์์ ์ ๋งคํ๋ ํ์ผ์ ์ด์ฉํ์ฌ ์งํ ํฉ๋๋ค.
- ์ผ์ผ์ด ๋ฉ๋ชจ๋ฆฌ ๋งตํํ์ง ๋ง๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋งคํํ ๋ฐฐ์ด์ child ํจ์ ์ธ์๋ก ๋๊ฒจ์ค์ ์คํํ๋ฉด ๋ ๊ฐ๋จํ๊ฒ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #define BUFSIZE 512 void do_child(int i, int *addr){ int fd, child, j; child = *(addr + 0); while(i != child){ sleep(2); printf(".........................pid : %d waiting\n", i); child = *(addr + 0); } for(j=0;j<5;j++){ sleep(1); printf("%dth child pid = %d\n", i, getpid()); } *(addr + 0) = child - 1; exit(0); } int main(int argc, char **argv){ int i, status, fd; pid_t pid[3]; int *addr; fd = open("temp", O_RDWR | O_CREAT | O_TRUNC, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ftruncate(fd, sizeof(int)); *(addr + 0) = 2; for(i=0;i<3;i++){ pid[i] =fork(); if(pid[i] == 0){ do_child(i, addr); } } for(i=0;i<3;i++){ wait(&status); } exit(0); }
-
๊ต์๋ ๋ต์
- ์ผ์ผ์ด ๋ฉ๋ชจ๋ฆฌ ๋งตํํ์ง ๋ง๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋งคํํ ๋ฐฐ์ด์ child ํจ์ ์ธ์๋ก ๋๊ฒจ์ค์ ์คํํ๋ฉด ๋ ๊ฐ๋จํ๊ฒ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #define BUFSIZE 512 void do_child(int i, int *turn){ int j, pid; if(i<2){ do{ }while(i!=*turn); } pid = getpid(); for(j=0;j<5;j++){ printf("child %d ... \n", pid); sleep(1); } if(i>0) *turn = i-1; exit(0); } int main(int argc, char **argv){ int i, status, fd; pid_t pid[3]; int *addr; fd = open("temp", O_RDWR | O_CREAT | O_TRUNC, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ftruncate(fd, sizeof(int)); *addr = 2; for(i=0;i<3;i++){ pid[i] =fork(); if(pid[i] == 0){ do_child(i, addr); } } for(i=0;i<3;i++){ wait(&status); } exit(0); }
-
p10-1.c parent process๋ ์ธ ๊ฐ์ child process๋ฅผ ๋ง๋ค๊ณ , parent process์์ child process๋ก์ ๋จ๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅ ํ pipe๋ฅผ ๋ง๋ญ๋๋ค. parent process๋ ์ธ๋ถ ์ ๋ ฅ์ผ๋ก ์ ์๋ฅผ 12๊ฐ ์ ๋ ฅ ๋ฐ์, ์ธ child process์๊ฒ ์์๋๋ก ๋ณด๋ ๋๋ค. child process๋ ์์ ์ด ๋ฐ์ ์ ์๋ฅผ ์์ ์ ํ๋ก์ธ์ค id์ ํจ๊ป ์ถ๋ ฅ ํฉ๋๋ค. parent process๋ ๋ชจ๋ ์ ์๋ฅผ ์ ๋ฌ ํ ํ ์ ์ -1์ ์ ๋ฌํ๊ณ , -1์ ์ ๋ฌ ๋ฐ์ผ๋ฉด child process๋ ์ข ๋ฃ ํฉ๋๋ค. ๋ชจ๋ child process์ ์ข ๋ฃ๋ฅผ ํ์ธ ํ ํ parent process๋ ์ข ๋ฃ ํฉ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #define BUFSIZE 512 void do_child(int id, int p[3][2]){ int i, in, pid = getpid(); for(i=0;i<3;i++){ close(p[i][1]); if(id != i) close(p[i][0]); } while(1){ read(p[id][0], &in, sizeof(int)); if(in == -1) exit(0); else printf("id : %d, pid : %d, input : %d\n", id, pid, in); } } int main(int argc, char **argv){ int i, in, pid, p[3][2]; for(i=0;i<3;i++){ pipe(p[i]); } for(i=0;i<3;i++){ if(fork() == 0){ do_child(i, p); } } for(i=0;i<3;i++){ close(p[i][0]); } for(i=0;i<12;i++){ scanf("%d", &in); write(p[i%3][1], &in, sizeof(int)); } in = -1; for(i=0;i<3;i++){ write(p[i][1], &in, sizeof(int)); } for(i=0;i<3;i++){ wait(0); } exit(0); }
-
p10-2.c parent process๋ ์ธ ๊ฐ์ child process๋ฅผ ๋ง๋ค๊ณ , ๋ชจ๋ child process๊ฐ ์ข ๋ฃ ํ ํ ์ข ๋ฃ ํฉ๋๋ค. ๊ฐ child process๋ ์์ ์ ์์๊ฐ ๋ ๋๊น์ง ๋๊ธฐ ํ์๋ค๊ฐ, 1์ด์ฉ ์ฌ๋ฉด์ (sleep (1); ์ฌ์ฉ) ์์ ์ process id(getpid(); ์ฌ์ฉ)๋ฅผ 5ํ ์ถ๋ ฅํ๋ ์์ ์ ํ ํ ์ข ๋ฃ ํฉ๋๋ค. child process์ id ์ธจ๋ ฅ ์์๋ ์์ฑ ์์์ ์ญ์์ด๋ฉฐ, ์ด์ ๊ฐ์ ์์ ๋๊ธฐํ ์์ ์ pipe๋ฅผ ์ด์ฉํ์ฌ ์งํ ํฉ๋๋ค.
- signal์์์ pause / kill์,,, pipe์์ read / write๋ผ๊ณ ๋ณผ ์ ์๋ค.
- pipe์์ ๊ธฐ๋ณธ์ผ๋ก blocking read๋ก ์ค์ ์ด ๋๊ธฐ ๋๋ฌธ์ write๊ฐ ์ค๊ธฐ ์ ๊น์ง read๋ block์ด ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ค๋ฆด ์ ์๋ค
#define BUFSIZE 512 void do_child(int id, int pipe[2][2]){ char buffer = 'a'; int i, pid = getpid(); if(id < 2){ read(pipe[id][0], &buffer, 1); } for(i=0;i<5;i++){ sleep(1); printf("id : %d, pid : %d\n", id, pid); } if(id > 0){ write(pipe[id-1][1], &buffer, 1); } exit(0); } int main(int argc, char **argv){ int i, status, fd, p[2][2]; pid_t pid[3]; for(i=0;i<2;i++){ pipe(p[i]); } for(i=0;i<3;i++){ pid[i] =fork(); if(pid[i] == 0){ do_child(i, p); } } for(i=0;i<3;i++){ wait(&status); } exit(0); }
-
p11-1 fifo๋ฅผ ์ด์ฉํ์ฌ ํต์ ํ๋ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ํ๋ก๊ทธ๋จ A๋ ์ธ๋ถ ์ ๋ ฅ์ผ๋ก ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ํ๋ก๊ทธ๋จ B์ ์ ๋ฌํฉ๋๋ค. ํ๋ก๊ทธ๋จ B๋ ์ ๋ฌ ๋ฐ์ ์ ์์ +8์ ํ ๋ค ํ๋ก๊ทธ๋จ A์ ๋๋ ค์ค๋๋ค. ํ๋ก๊ทธ๋จ A๋ ๋๋ ค๋ฐ์ ์ ์ ๊ฐ์ ์ถ๋ ฅ ํฉ๋๋ค. -1์ด ์ ๋ ฅ๋๋ฉด ๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํฉ๋๋ค.
-
O_WRONLY, O_RDONLY ๋ช ์ํด์ฃผ๋ ์์๊ฐ ์ค์ํจ
//A fd[0] = open(fifo[0], O_WRONLY); fd[1] = open(fifo[1], O_RDONLY);
//B fd[0] = open(fifo[0], O_RDONLY); fd[1] = open(fifo[1], O_WRONLY);
-
fifo f[0]์ ์ด์ฉํ ํ์ดํ fd[0]์ A์์ WRONLY๋ก ๋ง๋ค์์ผ๋ฉด RDONLY๋ก ์ง์ ๋ง์ถฐ์ค์ผํ๋๋ฐ, ์๋๊ฒ ๋๋ฉด ์๋ก๋ฅผ ๊ณ์ํด์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ deadlock ์ํ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ๋ ๊ฐ๋ง ์์ ๋๋ ์ ์ด์ ํฐ ๋ฌธ์ ๊ฐ ์ ์๊ธฐ๋๋ฐ, ๋ ๋ง์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ ํ๊ฒ๋๋ฉด ๋น๋ฒํ๊ฒ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
p11-1A.c
int main(int argc, char **argv){ char fifo[2][3] = {"f1", "f2"}; int i, in, fd[2]; for(i=0;i<2;i++){ mkfifo(fifo[i], 0600); } fd[0] = open(fifo[0], O_WRONLY); fd[1] = open(fifo[1], O_RDONLY); for(;;){ scanf("%d", &in); write(fd[0], &in, sizeof(int)); if(in == -1) exit(0); read(fd[1], &in, sizeof(int)); printf("final A received : %d\n", in); } exit(0); }
p11-1B.c
int main(int argc, char **argv){ char fifo[2][3] = {"f1", "f2"}; int i, in, fd[2]; fd[0] = open(fifo[0], O_RDONLY); fd[1] = open(fifo[1], O_WRONLY); for(;;){ read(fd[0], &in, sizeof(int)); printf("first B received : %d\n", in); if(in == -1) exit(0); in = in + 8; write(fd[1], &in, sizeof(int)); } exit(0); }
-
-
p11-2 server process๋ ์ธ ๊ฐ์ client process๋ค๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ fifo๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ client๋ ๋ฏธ๋ฆฌ ์ ํด์ง ์ด๋ฆ์ FIFO๋ก ์ ์ํ์ฌ, ํ์ค ์ ๋ ฅ์ผ๋ก ์ ๋ ฅ๋ ์ ์๋ฅผ server process์๊ฒ ์ ์กํฉ๋๋ค. server process๋ client process๋ก๋ถํฐ ์ ์ก๋ ์ ์ ๊ฐ์ +8์ ํ ํ, ํด๋น client์๊ฒ ๋ค์ ๋ณด๋ ๋๋ค. client process๋ ๋๋ ค๋ฐ์ ์ ์ ๊ฐ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํฉ๋๋ค. client process๋ ์ ์ ๋ฐ์ดํฐ์ ์ /์ถ๋ ฅ ์์ ์ 5ํ ๋ฐ๋ณตํ ํ ์ข ๋ฃ ํฉ๋๋ค. client process๋ก ๋ถํฐ์ ์ ๋ ฅ์ blocking์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด select ๋ฌธ์ฅ์ ์ฌ์ฉํฉ๋๋ค.
- O_RDONLY ํ ๋, O_RDWR์ ํด์ผํ๋์ง ์๋๋ฉด O_RDONLY๋ฅผ ํด์ผํ๋์ง ์์ง ๋ชจ๋ฅด๊ฒ ์
- p11-2server.c (ํ๊ต ๋ฆฌ๋
์ค ์๋ฒ ๋ฒ์ ).
- ๊ต์๋ ์์ ์๊ฐ๋ ๋ง์ํ์ ๊ฑฐ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ์ฝ๋๋ผ ์ด๊ฒ ์ ๋ต์ธ๋ฏํจ. clientํ๋ก๊ทธ๋จ ์ ๋ถ ๋ซํ๋ฉด ์ ๋ถ 0์ return ํ์ฌ select๋ 3์ ๋ฐํํ๊ฒ ๋๋๊ฑฐ๊ณ , ๊ทผ๋ฐ readํ ๊ฐ์ด 0๋ฐ์ดํธ์ธ ๊ฒฝ์ฐ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃํ ๊ฒฝ์ฐ๋ผ๊ณ ํ์ ์ ์ด๋ ๊ฒ ์์ฑํ์ง๋ง, ํน์๋ ์๋ชป๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด์ผํจ
int main(int argc, char **argv) { char fifo[6][15] = {"p2_f1", "p2_f2", "p2_f3", "p2_f4", "p2_f5", "p2_f6"}; int i, in, fd[6], select_check, nread, nread_count[3] = {0}; fd_set set, master; for(i=0;i<6;i++){ mkfifo(fifo[i], 0600); } fd[0] = open(fifo[0], O_RDONLY); fd[1] = open(fifo[1], O_RDONLY); fd[2] = open(fifo[2], O_RDONLY); fd[3] = open(fifo[3], O_WRONLY); fd[4] = open(fifo[4], O_WRONLY); fd[5] = open(fifo[5], O_WRONLY); FD_ZERO(&master); for (i=0;i<3;i++){ FD_SET(fd[i], &master); } while (set=master, (select_check = select(fd[2]+1, &set, NULL, NULL, NULL)) > 0) { for (i=0;i<3;i++) { if (FD_ISSET(fd[i], &set)) { if((nread = read(fd[i], &in, sizeof(int))) > 0){ printf("received : %d\n", in); in = in + 8; write(fd[i+3], &in, sizeof(int)); } else if(select_check == 3 && nread == 0) return 0; } } } exit(0); }
- p11-2server.c (๋ด ์ปดํจํฐ ๋ฒ์ )
int main(int argc, char **argv) { char fifo[6][15] = {"p2_f1", "p2_f2", "p2_f3", "p2_f4", "p2_f5", "p2_f6"}; int i, in, fd[6], select_check, nread, nread_count[3] = {0}; fd_set set, master; for(i=0;i<6;i++){ mkfifo(fifo[i], 0600); } fd[0] = open(fifo[0], O_RDONLY); fd[1] = open(fifo[1], O_RDONLY); fd[2] = open(fifo[2], O_RDONLY); fd[3] = open(fifo[3], O_WRONLY); fd[4] = open(fifo[4], O_WRONLY); fd[5] = open(fifo[5], O_WRONLY); FD_ZERO(&master); for (i=0;i<3;i++){ FD_SET(fd[i], &master); } while (set=master, (select_check = select(fd[2]+1, &set, NULL, NULL, NULL)) > 0) { for (i=0;i<3;i++) { if (FD_ISSET(fd[i], &set)) { if((nread = read(fd[i], &in, sizeof(int))) > 0){ printf("received : %d\n", in); in = in + 8; write(fd[i+3], &in, sizeof(int)); } else if(nread == 0) nread_count[i] = 1; } } if(nread_count[0] == 1 && nread_count[1] == 1 && nread_count[2] == 1) return 0; } exit(0); }
- p11-2client.c
int main(int argc, char **argv){ char fifo[6][15] = {"p2_f1", "p2_f2", "p2_f3", "p2_f4", "p2_f5", "p2_f6"}; int i, in, fd[6]; int id = atoi(argv[1]); fd[id] = open(fifo[id], O_WRONLY); fd[id+3] = open(fifo[id+3], O_RDONLY); scanf("%d", &in); write(fd[id], &in, sizeof(int)); read(fd[id+3], &in, sizeof(int)); for(i=0;i<5;i++){ sleep(1); printf("received : %d\n", in); } exit(0); }
-
p11-3 ๋ค ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฅผ ํ๋ฉฐ ์์ ์ ํ๋ก์ธ์ค id๋ฅผ 5ํ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ main() ํจ์์ arguments๋ก ๋๊ธฐํ์ ์ฐธ์ฌํ๋ ์ ์ฒด ํ๋ก์ธ์ค ์ค ์์ ์ ์ถ๋ ฅ ์์๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด, ์์๋๋ก ์์ ์ ํ๋ก์ธ์ค id๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋๊ธฐํ ์์ ์ fifo๋ฅผ ์ฌ์ฉํ์ฌ ์ํํฉ๋๋ค.
- ๋ค ๊ฐ์ ํ๋ก๊ทธ๋จ์ ๊ฐ๊ฐ ์คํํ ํ์ ๋ฉ์ธํจ์ ์ธ์๋ก 0, 1, 2, 3์ ์ฃผ๋ฉด ์์๋๋ก ์คํ ํ ์ข ๋ฃ๋ฅผ ์ํํ๋ค.
int main(int argc, char **argv){ char buf, f[3][3] = {"f1", "f2", "f3"}; int i, k ,in ,fd[2]; for(i=0;i<3;i++){ mkfifo(f[i], 0600); } k = atoi(argv[1]); if(k > 0) fd[0] = open(f[k-1], O_RDONLY); if(k < 3) fd[1] = open(f[k], O_WRONLY); if(k > 0) read(fd[0], &buf, 1); for(i=0;i<5;i++){ printf("pid : %d\n", getpid()); sleep(1); } if(k < 3) write(fd[1], "a", 1); exit(0); }
-
p12-1 server process๋ ์ธ ๊ฐ์ client process๋ค๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด message queue๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ client๋ message queue๋ฅผ ์ด์ฉํ์ฌ, ํ์ค ์ ๋ ฅ์ผ๋ก ์ ๋ ฅ๋ ์ ์๋ฅผ server process์๊ฒ ์ ์กํฉ๋๋ค. server process๋ client process๋ก๋ถํฐ ์ ์ก๋ ์ ์ ๊ฐ์ +8์ ํ ํ, ํด๋น client์๊ฒ ๋ค์ ๋ณด๋ ๋๋ค. client process๋ ๋๋ ค๋ฐ์ ์ ์ ๊ฐ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํฉ๋๋ค. client process๋ ์ ์ ๋ฐ์ดํฐ์ ์ /์ถ๋ ฅ ์์ ์ 5ํ ๋ฐ๋ณต ํ ํ ์ข ๋ฃํฉ๋๋ค. ๊ฐ client process๋ main() ํจ์์ arguments๋ก ์์ ์ id๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
- p12-1server.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> struct q_entry{ long mtype; int data; }; int main(int argc, char **argv){ int qid, i, in; struct q_entry msg; key_t key; key = ftok("key", 1); qid = msgget(key, 0600|IPC_CREAT); if(qid == -1){ perror("msgget"); exit(0); } for(i=0;i<15;i++){ msgrcv(qid, &msg, sizeof(int), -3, 0); msg.mtype += 3; msg.data += 8; msgsnd(qid, &msg, sizeof(int), 0); } //๋ฉ์ธ์งํ ๊ธฐ๋ฅ ๋ค ์ฌ์ฉํ๊ณ ์ญ์ ํด์ฃผ๋ ์์คํ ์ฝ ์ถ๊ฐ msgctl(qid, IPC_RMID, 0); exit(0); }
- p12-1client.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> struct q_entry{ long mtype; int data; }; int main(int argc, char **argv){ int qid, i, in, id; struct q_entry msg; key_t key; id = atoi(argv[1]); key = ftok("key", 1); qid = msgget(key, 0600|IPC_CREAT); if(qid == -1){ perror("msgget"); exit(0); } for(i=0;i<5;i++){ scanf("%d", &in); msg.mtype = id; msg.data = in; msgsnd(qid, &msg, sizeof(int), 0); msgrcv(qid, &msg, sizeof(int), id+3, 0); printf("%d\n", msg.data); } exit(0); }
-
p12-2.c ๋ค ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฅผ ํ๋ฉฐ ์์ ์ ํ๋ก์ธ์ค id๋ฅผ 5ํ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ main() ํจ์์ arguments๋ก ๋๊ธฐํ์ ์ฐธ์ฌํ๋ ์ ์ฒด ํ๋ก์ธ์ค ์ค ์์ ์ ์ถ๋ ฅ ์์๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด, ์์๋๋ก ์์ ์ ํ๋ก์ธ์ค id๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋๊ธฐํ ์์ ์ message queue๋ฅผ ์ฌ์ฉํ์ฌ ์ํํฉ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> struct q_entry{ long mtype; int data; }; int main(int argc, char **argv){ int i, id, qid; key_t key; struct q_entry msg; key = ftok("key", 3); qid = msgget(key, IPC_CREAT|0600); id = atoi(argv[1]); if(id > 1) msgrcv(qid, &msg, sizeof(int), id, 0); for(i=0;i<5;i++){ sleep(1); printf("id = %d pid = %d\n", id, getpid()); } if(id < 4){ msg.mtype = id + 1; msg.data = id; msgsnd(qid, &msg, sizeof(int), 0); } exit(0); }
-
p13-1 ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ด์ฉํ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ๋ ํ๋ก๊ทธ๋จ ๋ชจ๋ "data" ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํํฉ๋๋ค. ํ ํ๋ก๊ทธ๋จ์ ์ธ๋ถ ์ ๋ ฅ์ ์ฝ์ด์ ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์์ ์ 3ํ ์คํํฉ๋๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ์์ ์ 3ํ ์คํํฉ๋๋ค. ๋ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋๊ธฐํ๋ฅผ ์ํด semaphore๋ฅผ ์ฌ์ฉํฉ๋๋ค.
p13-1a.c
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ int i, len = 0, status, fd, semid; char *addr; key_t key; union semun arg; struct sembuf p_buf; key = ftok("key", 3); semid = semget(key, 1, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(key, 1, 0600); } else{ arg.val = 0; semctl(semid, 0, SETVAL, arg); } fd = open("temp", O_RDWR | O_CREAT | O_TRUNC, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ftruncate(fd, BUFSIZE); for(i=0;i<3;i++){ len = len + read(0, addr + len, BUFSIZE); len = len-1; *(addr+len) = '\0'; p_buf.sem_num = 0; p_buf.sem_op = 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); printf("semval : %d\n", semctl(semid, 0, GETVAL, arg)); } exit(0); }
p13-1b.c
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ int i, len = 0, fd, semid; char *addr; key_t key; union semun arg; struct sembuf p_buf; key = ftok("key", 3); semid = semget(key, 1, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(key, 1, 0600); } else{ arg.val = 0; semctl(semid, 0, SETVAL, arg); } fd = open("temp", O_RDWR | O_CREAT, 0600); addr = mmap(NULL, BUFSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); for(i=0;i<3;i++){ p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); printf("semval : %d\n", semctl(semid, 0, GETVAL, arg)); len = len + write(1, addr + len, strlen(addr+len)); write(1, "-------\n", 8); } exit(0); }
-
p13-2.c ๋ค ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฅผ ํ๋ฉฐ ์์ ์ ํ๋ก์ธ์ค id๋ฅผ 5ํ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ main()ํจ์์ arguments๋ก ๋๊ธฐํ์ ์ฐธ์ฌํ๋ ์ ์ฒด ํ๋ก์ธ์ค ์ค ์์ ์ ์ถ๋ ฅ ์์๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด, ์์๋๋ก ์์ ์ ํ๋ก์ธ์ค id๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋๊ธฐํ ์์ ์ semaphore๋ฅผ ์ฌ์ฉํ์ฌ ์ํํฉ๋๋ค.
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ int i, id, pid, semid; key_t key; union semun arg; ushort buf[3] = {0}; struct sembuf p_buf; id = atoi(argv[1]); key = ftok("key", 3); semid = semget(key, 3, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(key, 3, 0600); } else{ arg.array = buf; semctl(semid, 0, SETALL, arg); } if(id>1){ p_buf.sem_num = id-2; p_buf.sem_op = -1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } pid = getpid(); for(i=0;i<5;i++){ sleep(1); printf("pid : %d\n", pid); } if(id<4){ p_buf.sem_num = id-1; p_buf.sem_op = 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } exit(0); }
-
p13-3.c 2๋ฒ ๋ฌธ์ ์์ ๋ ์ ์ semaphore๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์์ฑํ์์ค.
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ int i, id, pid, semid; key_t key; union semun arg; struct sembuf p_buf; id = atoi(argv[1]); key = ftok("key", 1); semid = semget(key, 3, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(key, 3, 0600); } else{ arg.val = 0; semctl(semid, 0, SETVAL, arg); } if(id>1){ p_buf.sem_num = 0; p_buf.sem_op = -id; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } pid = getpid(); for(i=0;i<5;i++){ sleep(1); printf("pid : %d\n", pid); } if(id<4){ p_buf.sem_num = 0; p_buf.sem_op = id + 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } exit(0); }
-
p13-4.c ์ธ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฅผ ํ๋ฉฐ ์์ ์ ํ๋ก์ธ์ค id๋ฅผ 5ํ ์ฉ 3๋ฒ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ main() ํจ์์ arguments๋ก ๋๊ธฐํ์ ์ฐธ์ฌํ๋ ์ ์ฒด ํ๋ก์ธ์ค ์ค ์์ ์ ์ถ๋ ฅ ์์๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด, 1 โ 2 โ 3 โ 1 โ 2 โ 3 โ 1 โ 2 โ 3 ์์๋๋ก ์์ ์ ํ๋ก์ธ์ค id๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- (a) ๋๊ธฐํ ์์ ์ message queue๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ํฉ๋๋ค.
struct q_entry{ long mtype; int data; }; int main(int argc, char **argv){ int i, j, id, qid; key_t key; struct q_entry msg; key = ftok("key", 3); qid = msgget(key, IPC_CREAT|0600); id = atoi(argv[1]); for(i=4;i<7;i++){ //id = 1,2,3 //i = 4,5,6 if(id > 1) msgrcv(qid, &msg, sizeof(int), id, 0); if(id == 1 && i > 4) msgrcv(qid, &msg, sizeof(int), i, 0); for(j=0;j<3;j++){ sleep(1); printf("id = %d pid = %d\n", id, getpid()); } if(id < 3){ msg.mtype = id + 1; msg.data = id; msgsnd(qid, &msg, sizeof(int), 0); } else if(id == 3 && i < 6){ msg.mtype = i + 1; msg.data = id; msgsnd(qid, &msg, sizeof(int), 0); } } if(id == 3) msgctl(qid, IPC_RMID, 0); exit(0); }
- (b) ๋๊ธฐํ ์์ ์ semaphore๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ํฉ๋๋ค.
-
p14-1 ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ํ๋ก๊ทธ๋จ A๋ scanf() ๋ช ๋ น์ผ๋ก 10๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ ํ๋ ์์ ์ 10ํ ๋ฐ๋ณต ์คํํฉ๋๋ค. ํ๋ก๊ทธ๋จ B๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์ฅ๋ ๋ด์ฉ์ printf() ๋ช ๋ น์ผ๋ก ์ถ๋ ฅํ๋ ์์ ์ 10ํ ๋ฐ๋ณต ์คํํฉ๋๋ค. ์ด๋, ํ๋ก๊ทธ๋จ B๋ ํ๋ก ๊ทธ๋จ A๊ฐ ์ ์๋ฅผ ์ด ํ ์ฝ์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋๊ธฐํ ์์ ์ semaphore๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
write
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ key_t semkey, shmkey; int semid, shmid, i, n; int *buf; union semun arg; struct sembuf p_buf; semkey = ftok("semkey", 3); semid = semget(semkey, 1, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(semkey, 1, 0600); } else{ arg.val = 0; semctl(semid, 0, SETVAL, arg); } shmkey = ftok("shmfile", 1); shmid = shmget(shmkey, 10*sizeof(int), IPC_CREAT|0600); buf = (int *)shmat(shmid, 0, 0); for(i=0;i<10;i++){ scanf("%d", (buf+i)); //signal p_buf.sem_num = 0; p_buf.sem_op = 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } semctl(semid, IPC_RMID, 0); shmdt(buf); shmctl(shmid, IPC_RMID, 0); return 0; }
-
read
union semun{ int val; struct semid_ds *buf; ushort *array; }; int main(int argc, char **argv){ key_t semkey, shmkey; int semid, shmid, i, n; int *buf; union semun arg; struct sembuf p_buf; semkey = ftok("semkey", 3); semid = semget(semkey, 1, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(semkey, 1, 0600); } else{ arg.val = 0; semctl(semid, 0, SETVAL, arg); } shmkey = ftok("shmfile", 1); shmid = shmget(shmkey, 10*sizeof(int), IPC_CREAT|0600); buf = (int *)shmat(shmid, 0, 0); for(i=0;i<10;i++){ //wait p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); printf("%d\n", *(buf+i)); } semctl(semid, IPC_RMID, 0); shmdt(buf); shmctl(shmid, IPC_RMID, 0); return 0; }
-
-
p14-2 1๋ฒ์ ํ๋ก๊ทธ๋จ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ฒด ์ ๋ณด์ ์ํด ๋๊ธฐํ ์์ ์ด ์ด๋ฃจ์ด์ง๋๋ก ์์ ํฉ๋๋ค. semaphore๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ busy waiting์ผ๋ก block์ ํ ์๋ฐ์ ์์ด์, ๋นํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ด ๋๋ค.
-
write
struct databuf{ int flag; int data; }; int main(int argc, char **argv){ key_t key; int shmid, i, n; struct databuf *buf; key = ftok("shmfile", 1); shmid = shmget(key, 10* sizeof(struct databuf), IPC_CREAT|0600); buf = (struct databuf *)shmat(shmid, 0, 0); for(i=0;i<10;i++){ scanf("%d", &(buf+i)->data); (buf+i)->flag = 1; } shmdt(buf); shmctl(shmid, IPC_RMID, 0); return 0; }
-
read
struct databuf{ int flag; int data; }; int main(int argc, char **argv){ key_t key; int shmid, i, n; struct databuf *buf; key = ftok("shmfile", 1); shmid = shmget(key, 10* sizeof(struct databuf), IPC_CREAT|0600); buf = (struct databuf *)shmat(shmid, 0, 0); for(i=0;i<10;i++){ while((buf+i)->flag == 0); printf("%d\n", (buf+i)->data); } shmdt(buf); shmctl(shmid, IPC_RMID, 0); return 0; }
-
-
p14-3 Server process๋ ์ธ ๊ฐ์ client process๋ค๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ client๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด์ฉํ์ฌ ํ์ค ์ ๋ ฅ์ผ๋ก ์ ๋ ฅ๋ ์ ์๋ฅผ server process์๊ฒ ์ ์กํฉ๋๋ค. Server process๋ client process๋ก๋ถํฐ ์ ์ก๋ ์ ์ ๊ฐ์ +8์ ํ ํ, ํด๋น client์๊ฒ ๋ค์ ๋ณด๋ ๋๋ค. Client process๋ ๋๋ ค๋ฐ์ ์ ์ ๊ฐ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํฉ๋๋ค. Client process๋ ์ ์ ๋ฐ์ดํฐ์ ์ /์ถ๋ ฅ ์์ ์ 5ํ ๋ฐ๋ณต ํ ํ ์ข ๋ฃํฉ๋๋ค.
-
server๋ client ๋ชจ๋ busy waiting์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ณ ์์. ๊ทธ๋์ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ธ๋ฐ, shared memory๋ ์์ฑํ ๋๋ง OS๋ก switching ์ผ์ด๋๊ณ ์ดํ์๋ context switching์ด ์ ์ผ์ด๋๊ณ ํ๋ก์ธ์ค์์ ์์ ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ง ํจ์จ์ ์
-
๊ทธ๋์ ์ธ๋งํฌ๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋ ํจ๊ณผ์ ์ธ ์ฝ๋๊ฐ ๋ ์ ์์
-
shmgetํ ๋ EXCL ์ต์ ์ ์ ๋ถ์ด๋ ์ด์
- Flag ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ์๋, ์ ์๋๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ์ ์ฒ์์ 0์ผ๋ก ๋ชจ๋ ๋ค ์ค์ ๋ผ์์ด์ผํจ. 0๋ณด๋ค ํฐ ๊ฐ์ด ๋ค์ด๊ฐ ์์ผ๋ฉด ์ ๋จ
- shared memory๋ฅผ ๋ง๋ค๋ฉด ๊ธฐ๋ณธ์ผ๋ก 0์ผ๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์ EXCL ์ต์ ์ผ๋ก ๋ค์ ์ฌ์ค์ ์ ํด์ค ํ์๊ฐ ์์
- ํน์๋ 1๋ก ๋ชจ๋ flag ๊ฐ์ ์ค์ ํ๊ณ 1์ด ์๋ ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์จ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฅผ ํ ๊ฒ์ด๋ผ๋ฉด EXCL ์ต์ ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ flag๊ฐ์ ์ฌ์ค์ ํด์ค ํ์๊ฐ ์์.
-
server
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h> #define BUFSIZE 512 struct databuf{ int flag; int data; }; int main(int argc, char **argv){ int i, j, shmid; struct databuf *buf; key_t shmkey; shmkey = ftok("shmkey", 3); shmid = shmget(shmkey, 6*sizeof(struct databuf), 0600|IPC_CREAT); buf = (struct databuf *)shmat(shmid, 0 ,0); for(i=0;i<15;i++){ for(j=0;;j=(j+1)%3) if((buf+j)->flag == 1) break; (buf+j+3)->data = (buf+j)->data + 8; (buf+j)->flag = 0; (buf+j+3)->flag = 1; } shmctl(shmid, IPC_RMID, 0); exit(0); }
-
client
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h> #define BUFSIZE 512 struct databuf{ int flag; int data; }; int main(int argc, char **argv){ int i, j, id, shmid; struct databuf *buf; key_t shmkey; id = atoi(argv[1]); shmkey = ftok("shmkey", 3); shmid = shmget(shmkey, 6*sizeof(struct databuf), 0600|IPC_CREAT); buf = (struct databuf *)shmat(shmid, 0, 0); for(i=0;i<5;i++){ scanf("%d", &((buf+id)->data)); (buf+id)->flag = 1; while((buf+id+3)->flag == 0); printf("id : %d, input + 8 = %d\n", id, (buf+id+3)->data); (buf+id+3)->flag = 0; } exit(0); }
-
-
p14-4
p14-3 ๋ฌธ์ busy waiting ์ฌ์ฉํ์ง ๋ง๊ณ ์ธ๋งํฌ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด๋ณด๊ธฐ
-
์ธ๋งํฌ 2๊ฐ ๋ง๋ค์ด์ client์์ server๋ก ๋ณด๋ด๋ ๋๊ธฐํ๋ฅผ ์ํ ์ธ๋งํฌ ํ๋, server์์ client๋ก ๋ณด๋ด๋ ๋๊ธฐํ๋ฅผ ์ํ ์ธ๋งํฌ ํ๋, ์ ๋ ๊ฐ ์ธ๋งํฌ๋ฅผ ์ฌ์ฉ
-
์ด์ busy waiting์ด๋ ๋ค๋ฅด๊ฒ shared memory ๊ตฌ์กฐ์ฒด ๋ง๊ณ ๊ทธ๋ฅ int ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ์ฌ์ฉ.
-
flag ์์ด int size ํ๋๋ง ์ฌ์ฉํ์ฌ ์์
-
semgetํ ๋
semid = semget(semkey, 2, 0600|IPC_CREAT|IPC_EXCL);๋ ๋ฒ์งธ ์ธ์๋ ์ธ๋งํฌ ์งํฉ ๋ด์ ์ธ๋งํฌ ๊ฐฏ์์ด๋๊น ์ฃผ์ํ ๊ฒ -
server
int main(int argc, char **argv){ int i, semid, shmid; key_t semkey, shmkey; union semun arg; struct sembuf p_buf; ushort sembuf[2] = {0}; int *shmbuf; semkey = ftok("semkey", 3); semid = semget(semkey, 2, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(semkey, 1, 0600); } else{ arg.array = sembuf; semctl(semid, 0, SETALL, arg); } shmkey = ftok("shmkey", 3); shmid = shmget(shmkey, sizeof(int), 0600|IPC_CREAT); shmbuf = (int *)shmat(shmid, 0 ,0); for(i=0;i<15;i++){ //0 wait p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); *(shmbuf+0) = *(shmbuf+0) + 8; //1 signal p_buf.sem_num = 1; p_buf.sem_op = 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); } semctl(semid, IPC_RMID, 0); shmctl(shmid, IPC_RMID, 0); exit(0); }
-
client
int main(int argc, char **argv){ int i, semid, shmid; key_t semkey, shmkey; union semun arg; struct sembuf p_buf; ushort sembuf[2] = {0}; int *shmbuf; semkey = ftok("semkey", 3); semid = semget(semkey, 2, 0600|IPC_CREAT|IPC_EXCL); if(semid == -1){ semid = semget(semkey, 1, 0600); } else{ arg.array = sembuf; semctl(semid, 0, SETALL, arg); } shmkey = ftok("shmkey", 3); shmid = shmget(shmkey, sizeof(int), 0600|IPC_CREAT); shmbuf = (int *)shmat(shmid, 0 ,0); for(i=0;i<5;i++){ scanf("%d", (shmbuf+0)); //0 signal p_buf.sem_num = 0; p_buf.sem_op = 1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); //1 wait p_buf.sem_num = 1; p_buf.sem_op = -1; p_buf.sem_flg = 0; semop(semid, &p_buf, 1); printf("[input + 8] ==> %d\n", *(shmbuf+0)); } exit(0); }
-
-
p15-1.c Parent process๋ ํ์ค ์ ๋ ฅ์ผ๋ก ์ ์๋ฅผ ํ๋ ์ ๋ ฅ ๋ฐ์, โdata" ํ์ผ์ ์ด ํ, ์ธ ๊ฐ์ child process๋ค์ ๋ง๋ญ๋๋ค. ๊ฐ child process๋ "data" ํ์ผ์ ์ ์ ๊ฐ์ ์ฝ๊ณ 5์ด๊ฐ ๊ธฐ๋ค๋ ธ๋ค +10 ํ ๊ฐ์ ์๋๋ค. ์ธ child์ ๋ง์ ์ด ์ ํํ ๋๋๋ก file locking์ ์จ์ ๋๊ธฐํ๋ฅผ ํฉ๋๋ค.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h> #define BUFSIZE 512 void do_child(int fd){ int in; struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 4; lock.l_type = F_WRLCK; fcntl(fd, F_SETLKW, &lock); lseek(fd, 0, SEEK_SET); read(fd, &in, sizeof(int)); sleep(2); in = in + 10; lseek(fd, 0, SEEK_SET); write(fd, &in, sizeof(int)); lock.l_type = F_UNLCK; fcntl(fd, F_SETLK, &lock); exit(0); } int main(int argc, char **argv){ int fd, i, num; struct flock lock; pid_t pid[3]; fd=open("data", O_RDWR|O_CREAT, 0600); scanf("%d", &num); write(fd, &num, sizeof(int)); for(i=0;i<3;i++){ pid[i] = fork(); if(pid[i] == 0){ do_child(fd); } else{ wait(0); } } lseek(fd, 0, SEEK_SET); read(fd, &num, sizeof(int)); printf("%d\n", num); return 0; }
-
p15-2.c ๋ค ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฅผ ํ๋ฉฐ ์์ ์ ํ๋ก์ธ์ค id๋ฅผ 5ํ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑ ํฉ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ "turn1" file์ ์ด์ฉํ์ฌ ๋๊ธฐํ์ ์ฐธ์ฌํ๋ ์ ์ฒด ํ๋ก์ธ์ค ์ค ์์ ์ ์ถ๋ ฅ ์์๋ฅผ ๊ฒฐ์ ํฉ๋ ๋ค. ๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์์ ์ id๋ฅผ ์ถ๋ ฅํ์ง ์๋๋ก ํ๋ ๋๊ธฐํ ์์ ์ file locking์ ์ฌ์ฉ ํฉ๋๋ค. ๋ค ํ๋ก์ธ์ค์ ์ถ๋ ฅ ์์๊ฐ ์ ํด์ ธ ์์ง ์์ต๋๋ค. ๋์์ ์ถ๋ ฅ์ ํ์ง ์๋๋ก๋ง ํ๋ฉด ๋ฉ๋๋ค.
- ๋๊ธด ์๋๋๋ฐ, ์์ง ์๋ฒฝํ๊ฑด ์๋ ๊ฒ ๊ฐ์
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h> #define BUFSIZE 512 int main(int argc, char **argv){ int fd, i, in = 5; struct flock lock; fd=open("turn1", O_RDWR|O_CREAT, 0600); lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 4; lock.l_type = F_WRLCK; fcntl(fd, F_SETLKW, &lock); lseek(fd, 0, SEEK_SET); read(fd, &in, sizeof(int)); for(i=0;i<5;i++){ sleep(1); printf("pid = %d\n", getpid()); } lock.l_type = F_UNLCK; fcntl(fd, F_SETLK, &lock); return 0; }