├── README.md ├── 5_program_execution ├── func.c ├── func.h └── main.c ├── 9_memory_system_1 ├── pointer_write.c ├── pointer_read.c └── pointer_read_main.c ├── 13_process_management ├── exit_code.c ├── hello.c ├── getpid.c ├── argv_envp.c ├── gethostusername.c ├── fork_exec_1.c ├── fork_exec_2.c ├── fork_exec_3.c └── toy_shell.c ├── 4_data_representation_2 ├── 1_inaccuracy.c └── 2_equality.c ├── 3_data_representation_1 ├── 2_endian.c └── 1_overflow_underflow.c ├── 16_inter-process_communication ├── fifo_write.c ├── signal.c ├── msgq_send.c ├── fifo_read.c ├── fork.c ├── shm1.c ├── shm2.c ├── pipe.c ├── msgq_recv.c ├── sem2.c └── sem1.c └── 17_multithreading ├── t0.c └── t1.c /README.md: -------------------------------------------------------------------------------- 1 | # syssw 2 | 3 | Example source files for real-time operating system and system software lecture 4 | -------------------------------------------------------------------------------- /5_program_execution/func.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void func(char *s) 4 | { 5 | printf("%s", s); 6 | } 7 | -------------------------------------------------------------------------------- /9_memory_system_1/pointer_write.c: -------------------------------------------------------------------------------- 1 | void function(void) 2 | { 3 | *((unsigned long *) (0x78787878)) = 0x11111111; 4 | } 5 | -------------------------------------------------------------------------------- /13_process_management/exit_code.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | printf("Hello World\n"); 6 | return 3; 7 | } 8 | -------------------------------------------------------------------------------- /9_memory_system_1/pointer_read.c: -------------------------------------------------------------------------------- 1 | extern unsigned long p; 2 | 3 | void function(void) 4 | { 5 | p = *((unsigned long *)0x78787878); 6 | } 7 | -------------------------------------------------------------------------------- /13_process_management/hello.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(void) 5 | { 6 | printf("Hello World\n"); 7 | sleep(10); 8 | return 0; 9 | } 10 | -------------------------------------------------------------------------------- /5_program_execution/func.h: -------------------------------------------------------------------------------- 1 | #ifndef __FUNC_H__ 2 | #define __FUNC_H__ 3 | 4 | /* custom types */ 5 | typedef int myint_t; 6 | 7 | /* function prototypes */ 8 | void func(char *s); 9 | 10 | #endif 11 | -------------------------------------------------------------------------------- /9_memory_system_1/pointer_read_main.c: -------------------------------------------------------------------------------- 1 | #if 0 2 | unsigned long p = 16; /* p in data */ 3 | #else 4 | unsigned long p; /* p in bss */ 5 | #endif 6 | 7 | int main(void) 8 | { 9 | function(); 10 | } 11 | -------------------------------------------------------------------------------- /4_data_representation_2/1_inaccuracy.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | int i; 6 | float sum = 0.0; 7 | 8 | for (i = 0; i < 1000; i++) { 9 | sum += 0.001; 10 | } 11 | 12 | printf("%f\n", sum); 13 | 14 | return 0; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /13_process_management/getpid.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int main(int argc, char *argv[], char *envp[]) 6 | { 7 | printf("----> My PID = %d\n", getpid()); 8 | printf("----> My Parent's PID = %d\n", getppid()); 9 | while(1); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /4_data_representation_2/2_equality.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | float a = 1.0; 6 | float b = a / 3.0 - 1.0; 7 | float c = (b + 1.0) * 3.0; 8 | 9 | if (a == c) { 10 | printf("a is equal to c\n"); 11 | } 12 | else { 13 | printf("a is not equal to c\n"); 14 | } 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /13_process_management/argv_envp.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char *argv[], char *envp[]) 4 | { 5 | int i; 6 | printf("----> Number of arguments = %d\n", argc); 7 | for (i = 0; i < argc; i++) { 8 | printf("----> argv[%d] = \"%s\"\n", i, argv[i]); 9 | } 10 | for (i = 0; envp[i] != NULL; i++) { 11 | printf("----> envp[%d] = \"%s\"\n", i, envp[i]); 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /5_program_execution/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * This is the file with the main function 3 | * 4 | * Created by Jong-Chan Kim 5 | */ 6 | 7 | #include 8 | #include "func.h" 9 | 10 | #define LEN_STR (30 + 1) 11 | 12 | int g_global = 0; 13 | 14 | int main(void) 15 | { 16 | #if 1 17 | char str[LEN_STR] = "Hello World\n"; 18 | #else 19 | char str[LEN_STR] = "Goodbye World\n"; 20 | #endif 21 | 22 | func(str); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /3_data_representation_1/2_endian.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | int i; 6 | unsigned int a = 0; 7 | 8 | while (1) { 9 | printf("%u = %02x %02x %02x %02x", 10 | a, 11 | ((unsigned char *)&a)[0], 12 | ((unsigned char *)&a)[1], 13 | ((unsigned char *)&a)[2], 14 | ((unsigned char *)&a)[3]); 15 | a++; 16 | getchar(); 17 | } 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /16_inter-process_communication/fifo_write.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | int fd; 10 | 11 | fd = open("./fifo1", O_RDWR); 12 | if (fd < 0) { 13 | perror(argv[0]); 14 | exit(1); 15 | } 16 | if (argc == 2) 17 | write(fd, argv[1], strlen(argv[1]) + 1); 18 | close(fd); 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /3_data_representation_1/1_overflow_underflow.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | unsigned char uc; 6 | char sc; 7 | 8 | uc = 255; 9 | uc++; 10 | printf("255 + 1 = %u\n", uc); 11 | 12 | sc = 127; 13 | sc++; 14 | printf("127 + 1 = %d\n", sc); 15 | 16 | uc = 0; 17 | uc--; 18 | printf("0 - 1 = %u\n", uc); 19 | 20 | sc = -128; 21 | sc--; 22 | printf("-128 - 1 = %d\n", sc); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /13_process_management/gethostusername.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define LEN_HOSTNAME 30 9 | 10 | int main(void) 11 | { 12 | char hostname[LEN_HOSTNAME + 1]; 13 | memset(hostname, 0x00, sizeof(hostname)); 14 | printf("username: %s\n", getpwuid(getuid())->pw_name); 15 | 16 | gethostname(hostname, LEN_HOSTNAME); 17 | printf("hostname: %s\n", hostname); 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /17_multithreading/t0.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | void *mythread(void *arg) { 6 | printf("%s\n", (char *) arg); 7 | return NULL; 8 | } 9 | 10 | int main(void) 11 | { 12 | pthread_t p1, p2; 13 | printf("main: begin\n"); 14 | pthread_create(&p1, NULL, mythread, "A"); 15 | pthread_create(&p2, NULL, mythread, "B"); 16 | // join waits for the threads to finish 17 | pthread_join(p1, NULL); 18 | pthread_join(p2, NULL); 19 | printf("main: end\n"); 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /13_process_management/fork_exec_1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(int argc, char *argv[], char *envp[]) 5 | { 6 | pid_t pid; 7 | 8 | printf("My PID = %d\n", getpid()); 9 | 10 | pid = fork(); 11 | if (pid < 0) { 12 | fprintf(stderr, "fork failed\n"); 13 | return 1; 14 | } 15 | if (pid != 0) { /* parent */ 16 | printf("I'm the parent. My PID = %d\n", getpid()); 17 | while(1); 18 | } 19 | else { /* child */ 20 | printf("I'm the child. My PID = %d\n", getpid()); 21 | while(1); 22 | } 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /16_inter-process_communication/signal.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | struct sigaction act; 7 | 8 | void sighandler(int signum, siginfo_t *info, void *ptr) 9 | { 10 | printf("Received signal %d\n", signum); 11 | printf("Signal originates from process %lu\n", 12 | (unsigned long)info->si_pid); 13 | } 14 | 15 | int main() 16 | { 17 | printf("I am %lu\n", (unsigned long)getpid()); 18 | 19 | memset(&act, 0, sizeof(act)); 20 | 21 | act.sa_sigaction = sighandler; 22 | act.sa_flags = SA_SIGINFO; 23 | 24 | sigaction(SIGUSR1, &act, NULL); 25 | 26 | // Waiting for CTRL+C... 27 | sleep(100); 28 | 29 | return 0; 30 | } 31 | -------------------------------------------------------------------------------- /16_inter-process_communication/msgq_send.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 7 | 8 | int main(int argc, char *argv[]) 9 | { 10 | key_t key; 11 | int qid; 12 | key = ftok(PATH, 'z'); 13 | if (key < 0) { 14 | perror(argv[0]); 15 | fprintf(stderr, "%d\n", __LINE__); 16 | exit(1); 17 | } 18 | qid = msgget(key, 0600); 19 | if (qid < 0) { 20 | perror(argv[0]); 21 | fprintf(stderr, "%d\n", __LINE__); 22 | exit(1); 23 | } 24 | printf("qid = %d\n", qid); 25 | msgsnd(qid, argv[1], strlen(argv[1]) + 1, 0); 26 | exit(0); 27 | } 28 | -------------------------------------------------------------------------------- /16_inter-process_communication/fifo_read.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | int fd, n; 12 | char req[PIPE_BUF]; 13 | 14 | if (mkfifo("./fifo1", 0600) < 0) { 15 | perror(argv[0]); 16 | exit(1); 17 | } 18 | fd = open("./fifo1", O_RDONLY); 19 | if (fd < 0) { 20 | perror(argv[0]); 21 | exit(1); 22 | } 23 | while (1) { 24 | n = read(fd, req, PIPE_BUF); 25 | if (n > 0) { 26 | printf("%d bytes read\n", n); 27 | write(STDOUT_FILENO, req, n); 28 | } 29 | } 30 | exit(0); 31 | } 32 | -------------------------------------------------------------------------------- /13_process_management/fork_exec_2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | char *args[] = {"./hello", "arg1", "arg2", "arg3", NULL}; 5 | 6 | int main(int argc, char *argv[], char *envp[]) 7 | { 8 | int ret; 9 | pid_t pid; 10 | 11 | printf("My PID = %d\n", getpid()); 12 | 13 | pid = fork(); 14 | if (pid < 0) { 15 | fprintf(stderr, "fork failed\n"); 16 | return 1; 17 | } 18 | if (pid != 0) { /* parent */ 19 | printf("I'm the parent. My PID = %d and my child's PID = %d\n", getpid(), pid); 20 | sleep(20); 21 | } 22 | else { /* child */ 23 | printf("I'm the child. My PID = %d\n", getpid()); 24 | sleep(10); 25 | ret = execve(args[0], args, NULL); 26 | if (ret < 0) { 27 | fprintf(stderr, "execve failed\n"); 28 | return 1; 29 | } 30 | } 31 | 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /16_inter-process_communication/fork.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int a = 0; 7 | int b = 0; 8 | 9 | int main(int argc, char *argv[], char *envp[]) 10 | { 11 | int ret, status; 12 | pid_t pid, cpid; 13 | 14 | printf("My PID = %d\n", getpid()); 15 | 16 | pid = fork(); 17 | if (pid < 0) { 18 | fprintf(stderr, "fork failed\n"); 19 | return 1; 20 | } 21 | if (pid != 0) { /* parent */ 22 | printf("! I'm the parent. My PID = %d and my child's PID = %d\n", getpid(), pid); 23 | a = 1; 24 | printf("! a = %d b = %d\n", a, b); 25 | sleep(6); 26 | printf("! a = %d b = %d\n", a, b); 27 | } 28 | else { /* child */ 29 | printf("@ I'm the child. My PID = %d\n", getpid()); 30 | sleep(3); 31 | printf("@ a = %d b = %d\n", a, b); 32 | b = 1; 33 | printf("@ a = %d b = %d\n", a, b); 34 | } 35 | 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /17_multithreading/t1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | unsigned int loop_cnt; 6 | volatile unsigned int counter = 0; // shared global variable 7 | 8 | void *mythread(void *arg) 9 | { 10 | char *letter = arg; 11 | int i; 12 | printf("%s: begin\n", letter); 13 | for (i = 0; i < loop_cnt; i++) { 14 | counter = counter + 1; 15 | } 16 | printf("%s: done\n", letter); 17 | return NULL; 18 | } 19 | 20 | int main(int argc, char *argv[]) 21 | { 22 | loop_cnt = atoi(argv[1]); 23 | 24 | pthread_t p1, p2; 25 | printf("main: begin [counter = %d]\n", counter); 26 | pthread_create(&p1, NULL, mythread, "A"); 27 | pthread_create(&p2, NULL, mythread, "B"); 28 | // join waits for the threads to finish 29 | pthread_join(p1, NULL); 30 | pthread_join(p2, NULL); 31 | printf("main: done [counter: %d] [should be: %d]\n", counter, loop_cnt * 2); 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /16_inter-process_communication/shm1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | key_t key; 14 | int shmid, i; 15 | char *ptr; 16 | 17 | key = ftok(PATH, 'z'); 18 | if (key < 0) { 19 | perror(argv[0]); 20 | exit(1); 21 | } 22 | shmid = shmget(key, 4096, 0666 | IPC_CREAT); 23 | if (shmid < 0) { 24 | perror(argv[0]); 25 | exit(1); 26 | } 27 | 28 | printf("shmid = %d\n", shmid); 29 | 30 | ptr = shmat(shmid, NULL, 0); 31 | if (ptr == NULL) { 32 | perror(argv[0]); 33 | exit(1); 34 | } 35 | 36 | printf("Writing As\n"); 37 | for (i = 0; i < 1024; i++) { 38 | ptr[i] = 'A'; 39 | } 40 | sleep(10); 41 | printf("Writing Bs\n"); 42 | for (i = 0; i < 1024; i++) { 43 | ptr[i] = 'B'; 44 | } 45 | exit(1); 46 | } 47 | -------------------------------------------------------------------------------- /16_inter-process_communication/shm2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | key_t key; 14 | int shmid, i; 15 | char *ptr; 16 | 17 | key = ftok(PATH, 'z'); 18 | if (key < 0) { 19 | perror(argv[0]); 20 | exit(1); 21 | } 22 | shmid = shmget(key, 4096, 0666); 23 | if (shmid < 0) { 24 | perror(argv[0]); 25 | exit(1); 26 | } 27 | 28 | printf("shmid = %d\n", shmid); 29 | 30 | ptr = shmat(shmid, NULL, 0); 31 | if (ptr == NULL) { 32 | perror(argv[0]); 33 | exit(1); 34 | } 35 | 36 | printf("----------\n"); 37 | for (i = 0; i < 10; i++) { 38 | printf("%c\n", ptr[i]); 39 | } 40 | sleep(10); 41 | printf("----------\n"); 42 | for (i = 0; i < 10; i++) { 43 | printf("%c\n", ptr[i]); 44 | } 45 | 46 | exit(1); 47 | } 48 | -------------------------------------------------------------------------------- /16_inter-process_communication/pipe.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define MAX_LINE (30 + 1) 6 | 7 | int main(int argc, char *argv[]) { 8 | int fd[2], n; 9 | pid_t pid; 10 | char line[MAX_LINE] = ""; 11 | 12 | if (pipe(fd) < 0) { 13 | perror(argv[0]); 14 | exit(1); 15 | } 16 | pid = fork(); 17 | if (pid < 0) { /* fork() error */ 18 | perror(argv[0]); 19 | exit(1); 20 | } 21 | 22 | if (pid > 0) { /* parent */ 23 | char *hello = "hello baby"; 24 | write(fd[1], hello, 11); 25 | printf("parent : Write to pipe <%s>\n", hello); 26 | sleep(2); 27 | n = read(fd[0], line, MAX_LINE); 28 | printf("parent : Read from pipe <%s>\n", line); 29 | } 30 | else { /* child */ 31 | char *hello = "hello mommy"; 32 | sleep(1); 33 | n = read(fd[0], line, MAX_LINE); 34 | printf("child : Read from pipe <%s>\n", line); 35 | write(fd[1], hello, 12); 36 | printf("child : Write to pipe <%s>\n", hello); 37 | } 38 | exit(0); 39 | } 40 | -------------------------------------------------------------------------------- /16_inter-process_communication/msgq_recv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 9 | 10 | int main(int argc, char *argv[]) 11 | { 12 | key_t key; 13 | int qid; 14 | char buf[1024]; 15 | 16 | key = ftok(PATH, 'z'); 17 | if (key < 0) { 18 | perror(argv[0]); 19 | fprintf(stderr, "%d\n", __LINE__); 20 | exit(1); 21 | } 22 | qid = msgget(key, 0666 | IPC_CREAT); 23 | if (qid < 0) { 24 | fprintf(stderr, "%d\n", __LINE__); 25 | perror(argv[0]); 26 | exit(1); 27 | } 28 | printf("qid = %d\n", qid); 29 | while (1) { 30 | if (msgrcv(qid, buf, 1024, 0, 0) < 1) { 31 | perror(argv[0]); 32 | fprintf(stderr, "%d\n", __LINE__); 33 | exit(1); 34 | } 35 | if (!strncmp(buf, "quit", 4)) { 36 | break; 37 | } 38 | printf("%s\n", buf); 39 | } 40 | msgctl(qid, IPC_RMID, NULL); 41 | exit(0); 42 | } 43 | -------------------------------------------------------------------------------- /13_process_management/fork_exec_3.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | char *args[] = {"./hello", NULL}; 7 | 8 | int main(int argc, char *argv[], char *envp[]) 9 | { 10 | int ret, status; 11 | pid_t pid, cpid; 12 | 13 | printf("My PID = %d\n", getpid()); 14 | 15 | pid = fork(); 16 | if (pid < 0) { 17 | fprintf(stderr, "fork failed\n"); 18 | return 1; 19 | } 20 | if (pid != 0) { /* parent */ 21 | printf("I'm the parent. My PID = %d and my child's PID = %d\n", getpid(), pid); 22 | cpid = waitpid(pid, &status, 0); 23 | if (cpid != pid) { 24 | fprintf(stderr, "waitpid failed\n"); 25 | } 26 | printf("Child process terminated\n"); 27 | if (WIFEXITED(status)) { 28 | printf("Exit status is %d\n", WEXITSTATUS(status)); 29 | } 30 | } 31 | else { /* child */ 32 | printf("I'm the child. My PID = %d\n", getpid()); 33 | ret = execve(args[0], args, NULL); 34 | if (ret < 0) { 35 | fprintf(stderr, "execve failed\n"); 36 | return 1; 37 | } 38 | } 39 | 40 | return 0; 41 | } 42 | -------------------------------------------------------------------------------- /16_inter-process_communication/sem2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | union semun { 9 | int val; 10 | struct semid_ds *buf; 11 | ushort *array; 12 | }; 13 | 14 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 15 | 16 | int main(int argc, char *argv[]) 17 | { 18 | key_t key; 19 | int semid; 20 | struct sembuf s; 21 | union semun arg; 22 | 23 | key = ftok(PATH, 'z'); 24 | if (key < 0) { 25 | perror(argv[0]); 26 | exit(1); 27 | } 28 | semid = semget(key, 1, 0600 | IPC_CREAT); 29 | if (semid < 0) { 30 | perror(argv[0]); 31 | exit(1); 32 | } 33 | 34 | printf("semid = %d\n", semid); 35 | 36 | /* Lock */ 37 | s.sem_num = 0; 38 | s.sem_op = -1; 39 | s.sem_flg = 0; 40 | semop(semid, &s, 1); 41 | 42 | printf("getting sem\n"); 43 | sleep(10); 44 | printf("releasing sem\n"); 45 | 46 | /* Unlock */ 47 | s.sem_num = 0; 48 | s.sem_op = 1; 49 | s.sem_flg = 0; 50 | semop(semid, &s, 1); 51 | 52 | semctl(semid, 0, IPC_RMID, NULL); 53 | exit(1); 54 | } 55 | -------------------------------------------------------------------------------- /16_inter-process_communication/sem1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | union semun { 9 | int val; 10 | struct semid_ds *buf; 11 | ushort *array; 12 | }; 13 | 14 | #define PATH "/home/jongchank/syssw/16_inter-process_communication/key" 15 | 16 | int main(int argc, char *argv[]) 17 | { 18 | key_t key; 19 | int semid; 20 | struct sembuf s; 21 | union semun arg; 22 | 23 | key = ftok(PATH, 'z'); 24 | if (key < 0) { 25 | perror(argv[0]); 26 | exit(1); 27 | } 28 | semid = semget(key, 1, 0600 | IPC_CREAT); 29 | if (semid < 0) { 30 | perror(argv[0]); 31 | exit(1); 32 | } 33 | 34 | printf("semid = %d\n", semid); 35 | 36 | arg.val = 1; 37 | semctl(semid, 0, SETVAL, arg); 38 | 39 | /* Lock */ 40 | s.sem_num = 0; 41 | s.sem_op = -1; 42 | s.sem_flg = 0; 43 | semop(semid, &s, 1); 44 | 45 | printf("getting sem\n"); 46 | sleep(10); 47 | printf("releasing sem\n"); 48 | 49 | /* Unlock */ 50 | s.sem_num = 0; 51 | s.sem_op = 1; 52 | s.sem_flg = 0; 53 | semop(semid, &s, 1); 54 | /* 55 | semctl(semid, 0, IPC_RMID, NULL); 56 | */ 57 | exit(1); 58 | } 59 | -------------------------------------------------------------------------------- /13_process_management/toy_shell.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define MAX_LEN_LINE 10 10 | 11 | int main(void) 12 | { 13 | char command[MAX_LEN_LINE]; 14 | char *args[] = {command, NULL}; 15 | int ret, status; 16 | pid_t pid, cpid; 17 | 18 | while (true) { 19 | char *s; 20 | int len; 21 | 22 | printf("MyShell $ "); 23 | s = fgets(command, MAX_LEN_LINE, stdin); 24 | if (s == NULL) { 25 | fprintf(stderr, "fgets failed\n"); 26 | exit(1); 27 | } 28 | 29 | len = strlen(command); 30 | printf("%d\n", len); 31 | if (command[len - 1] == '\n') { 32 | command[len - 1] = '\0'; 33 | } 34 | 35 | printf("[%s]\n", command); 36 | 37 | pid = fork(); 38 | if (pid < 0) { 39 | fprintf(stderr, "fork failed\n"); 40 | exit(1); 41 | } 42 | if (pid != 0) { /* parent */ 43 | cpid = waitpid(pid, &status, 0); 44 | if (cpid != pid) { 45 | fprintf(stderr, "waitpid failed\n"); 46 | } 47 | printf("Child process terminated\n"); 48 | if (WIFEXITED(status)) { 49 | printf("Exit status is %d\n", WEXITSTATUS(status)); 50 | } 51 | } 52 | else { /* child */ 53 | ret = execve(args[0], args, NULL); 54 | if (ret < 0) { 55 | fprintf(stderr, "execve failed\n"); 56 | return 1; 57 | } 58 | } 59 | } 60 | return 0; 61 | } 62 | --------------------------------------------------------------------------------