Skip to content

Latest commit

ย 

History

History
1443 lines (1143 loc) ยท 46.4 KB

File metadata and controls

1443 lines (1143 loc) ยท 46.4 KB

UnixProgramming

20180903

  • ํฌ์ธํ„ฐ

    #include <stdio.h>
    
    void swapNumber(int *first, int *second) {
        int temp;
        temp = *first;
        *first = *second;
        *second = temp;
    }

int main() { int num1 = 10; int num2 = 20;

  swapNumber(&num1, &num2);
printf("%d %d\n", num1, num2);
  return 0;

}


```c
20 10

๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ๋ฐ”๊นฅ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

์ง€๊ธˆ๊นŒ์ง€ scanf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋„ฃ์ง€ ์•Š๊ณ  &๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋„ฃ์—ˆ๋‹ค ์™œ๋ƒํ•˜๋ฉด scanfํ•จ์ˆ˜๋Š” ๊ฐ’์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฐ˜ํ™˜๊ฐ’๋งŒ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ํ•จ์ˆ˜ ๋ฐ”๊นฅ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ

  int num1;
  int num2;
int num3;
  
  scanf("%d %d %d", &num1, &num2, &num3); // scanf์—์„œ ๊ฐ’์„ 3๊ฐœ ๊ฐ€์ ธ์˜ด(scanf๋Š” ๋ฐ”๊นฅ์œผ๋กœ ๊ฐ’์„ 3๊ฐœ ์ „๋‹ฌ)

  • ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ

    #include <stdio.h>
    
    void printArray(int arr[], int count) {    // ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ์™€ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ›์Œ
        for (int i = 0; i < count; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    
    int main() {
        int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      printArray(numArr, sizeof(numArr) / sizeof(int));    // ๋ฐฐ์—ด๊ณผ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋„ฃ์Œ
        return 0;
    }

1 2 3 4 5 6 7 8 9 10


- ํ•จ์ˆ˜์—์„œ ๋ฐฐ์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋’ค์— []๋งŒ ๋ถ™์ด๋ฉด ๋จ
(๋Œ€๊ด„ํ˜ธ ์•ˆ์— ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋”๋ผ๋„ ๋ฌด์‹œ๋œ๋‹ค)
- ์ฆ‰, arr[]์€ ๋ฐฐ์—ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ์ด๋ฉฐ ๋ฐฐ์—ด์˜ ์‹ค์ œ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ›์•„์•ผํ•จ
- ์ด๋•Œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ sizeof(๋ฐฐ์—ด) / sizeof(์ž๋ฃŒํ˜•)์ž„
  ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์ธ 10์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด๋„ ๋˜์ง€๋งŒ sizeof๋กœ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋ฉด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋จ
- printArray ์•ˆ์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ arr๊ณผ count๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Œ
- ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ arr[]๊ณผ ๊ฐ™์ด ์ง€์ •ํ–ˆ๋‹ค๋ฉด arr์€ ํฌ์ธํ„ฐ์ž„
  ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋จ

```c
#include <stdio.h>

void printArray(int *arr, int count) {    // ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌ์ธํ„ฐ๋กœ ์ง€์ •ํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ฐ›์Œ
    for (int i = 0; i < count; i++) {
      printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    printArray(numArr, sizeof(numArr) / sizeof(int));    // ๋ฐฐ์—ด๊ณผ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋„ฃ์Œ 
    return 0;
}
1 2 3 4 5 6 7 8 9 10
  • 1์ฐจ์› ๋ฐฐ์—ด์€ int *arr๊ณผ ๊ฐ™์ด intํ˜• ํฌ์ธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ ๋ฌผ๋ก  ํฌ์ธํ„ฐ๋กœ๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

  • (pArr + n)์€, ํฌ์ธํ„ฐ pArr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์—์„œ n์นธ ๊ฑด๋„ˆํŽธ์˜ ์š”์†Œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ผ ๋ผ๋Š” ๋œป

  • ๊ณต์‹์ด๋ผ ์ƒ๊ฐํ•˜๊ธฐ : arr[i] == *(arr + i)

    • ๋ฐฐ์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„  ์ ‘๊ทผ์„ ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผํ•จ. ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด, ๊ฐ„ํ˜น ์„ ์–ธํ•ด๋†“์€ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ์ข…์ข… ๋„˜์–ด์„œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ , ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ด. ์ฃผ์˜ํ•  ๊ฒƒ
  • ์‹ค์Šต1. vi editor ์ž‘์„ฑ ์‹ค์Šต

    #include<stdio.h>
    
    int main(void){
        int i, data[10];
        
        for (i=0;i<10;i++) {
            scanf("%d", &data[i]);
        }
        
        for (i=0;i<10;i++) {
            data[i]=data[i]+5;
        }
        
        for (i=0;i<10;i++) {
            printf("%-5d", data[i]);
        }
        
        printf("\n");
        return 0;
    }
  • ์‹ค์Šต2. ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹ค์Šต

    int add_five(int data) {
        return data + 5;
    }
    
    int main(void) {
        int i, data[10];
    
        for(i=0;i<10;i++) {
            scanf("%d", &data[i]);
            data[i] = add_five(data[i]);
        }
    
        for(i=0;i<10;i++) {
            printf("%-5d", data[i]);
        }
    
        printf("\n");
      return 0;
    }
  • ์‹ค์Šต3. ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—ฐ์Šต

    int add_five(int *data) {
        *data = *data + 5;
    }
    
    int main(void) {
        int i, data[10];
    
        for(i=0;i<10;i++) {
            scanf("%d", &data[i]);
            add_five(&data[i]);
        }
    
        for(i=0;i<10;i++) {
            printf("%-5d", data[i]);
        }
    
        printf("\n");
      return 0;
    }
  • ์‹ค์Šต4. ๋ฐฐ์—ด ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—ฐ์Šต

    int add_five(int *data) {
        int i;
        for(i=0;i<10;i++) {
            scanf("%d", &data[i]);
            data[i] = data[i] + 5;
        }
    }
    
    int main(void) {
        int i, data[10];
    
        add_five(data);
    
        for(i=0;i<10;i++) {
            printf("%-5d", data[i]);
        }
    
        printf("\n");
      return 0;
    }
  int add_five(int *data) {
      int i;
      for(i=0;i<10;i++) {
          scanf("%d", (data + i));
          *(data + i) = *(data + i) + 5;
      }
  }
  
int main(void) {
      int i, data[10];
  
    add_five(data);
  
    for(i=0;i<10;i++) {
          printf("%-5d", data[i]);
      }
  
    printf("\n");
      return 0;
}
  • ์‹ค์Šต5

    //home directory์— LAB09-03 directory๋ฅผ ๋งŒ๋“  ํ›„, 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ, 4๋ฒˆ์—์„œ ๋งŒ๋“  ํŒŒ์ผ๋“ค์„ LAB09-03 directory๋กœ ์˜ฎ๊ธด๋‹ค
    
    $ mkdir LAB09-03
    $ mv test1.c LAB09-03
    $ mv test1.out LAB09-03
    
  • ์‹ค์Šต6

    //LAB09-03 directory์˜ ํŒŒ์ผ ์ค‘ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์—๋Š” 0600, ์‹คํ–‰ํŒŒ์ผ์—๋Š” 0700์˜ access
    permission์„ ๋ถ€์—ฌ ํ•œ๋‹ค
    
    $ chmod 0600 test1.c
    $ chmod 0700 test1.out
    ...
    
  • ์‹ค์Šต7

    // LAB09-03 directory์— 0700์˜ access permission์„ ๋ถ€์—ฌํ•œ๋‹ค
    
    $ chmod 0700 LAB09-03
    

20180905

  • 1-a. "test1" file์„ ๋‚˜๋งŒ ์ฝ๊ธฐ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ์“ฐ๊ธฐ์šฉ์œผ๋กœ open ํ•œ ํ›„, โ€œtest1" file์— ๋ฌธ์ž ๋ณ€์ˆ˜ ch์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ 10๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. ch์€ โ€˜X'๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test1" file์— ๋ฌธ์ž โ€™X'๊ฐ€ 10๊ฐœ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        char ch = 'X';
        int i, fd = open("test1", O_WRONLY | O_CREAT, 0600);
        for(i=0;i<10;i++) {
            write(fd, &ch, 1);
        }
        return 0;
    }
  • 1-b. โ€œtest2" file์„ ๋‚˜๋Š” ์ฝ๊ธฐ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ณ , ๋‚˜์™€ ๊ฐ™์€ ๊ทธ๋ฃน์˜ ์‚ฌ์šฉ์ž๋“ค์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ์“ฐ๊ธฐ์šฉ์œผ๋กœ open ํ•ฉ๋‹ˆ๋‹ค. โ€œtest2" file์— ์ •์ˆ˜ ๋ณ€์ˆ˜ data์— ์ €์žฅ๋œ ์ •์ˆ˜๋ฅผ 10๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. data๋Š” 35๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test2" file์— 35๊ฐ€ 10๋ฒˆ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. shell ์ƒ์—์„œ ls -l ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€œtest2" file์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        int i, data = 35;
        int fd = open("test2", O_WRONLY | O_CREAT, 0640);
        for(i=0;i<10;i++) {
            write(fd, &data, 4);
        }
        return 0;
    }
  • 1-c. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” โ€œtest1" file์„ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ open ํ•ฉ๋‹ˆ๋‹ค. โ€œtest1" file์— ๋ฌธ์ž ๋ณ€์ˆ˜ ch์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ 5๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. ch์€ โ€˜Y'๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test1" file์— ๋ฌธ์ž โ€™Y'๊ฐ€ 5๊ฐœ, ์ด์–ด์„œ ๋ฌธ์ž โ€˜X'๊ฐ€ 5๊ฐœ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        char ch = 'Y';
        int i, fd = open("test1", O_WRONLY);
        for(i=0;i<5;i++) {
            write(fd, &ch, 1);
        }
        return 0;
    }
  • 1-d. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” โ€œtest1" file ๋‚ด์šฉ์„ ๋ณด์กดํ•˜๊ณ , file์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ถ€ํ„ฐ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ open ํ•ฉ๋‹ˆ ๋‹ค. โ€œtest1" file์— ๋ฌธ์ž ๋ณ€์ˆ˜ ch์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ 5๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. ch์€ โ€˜Z'๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test1" file์— ๋ฌธ์ž โ€™Y'๊ฐ€ 5๊ฐœ, ์ด์–ด์„œ ๋ฌธ์ž โ€˜X' ๊ฐ€ 5๊ฐœ, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฌธ์ž โ€™Z'๊ฐ€ 5๊ฐœ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        char ch = 'Z';
        int i, fd = open("test1", O_WRONLY | O_APPEND);
        for(i=0;i<5;i++) {
            write(fd1, &ch, 1);
        }
        return 0;
    }
  • 1-e. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” โ€œtest1" file์˜ ๊ธฐ์กด ๋‚ด์šฉ์„ ์ „๋ถ€ ์ง€์šฐ๊ณ , ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ open ํ•ฉ๋‹ˆ๋‹ค. โ€œtest1" file์— ๋ฌธ์ž ๋ณ€์ˆ˜ ch์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ 3๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. ch์€ โ€˜K'๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test1" file์— ๋ฌธ์ž โ€™K'๋งŒ 3๊ฐœ๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        char ch = 'K';
        int i, fd = open("test1", O_WRONLY | O_TRUNC);
        for(i=0;i<3;i++) {
            write(fd, &ch, 1);
        }
        return 0;
    }
  • 1-f. โ€œtest3" file์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด, file open์„ ํฌ๊ธฐํ•˜๊ณ  โ€test3" file์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‚˜๋Š” ์ฝ๊ธฐ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋“ค์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ƒ์„ฑ ํ•œ ํ›„, ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ open ํ•ฉ๋‹ˆ๋‹ค. "test3" file์˜ open์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋Š” โ€œtest3" file์— ๋ฌธ์ž ๋ณ€์ˆ˜ ch์— ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ 10๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์”๋‹ˆ๋‹ค. ch์€ โ€˜K'๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ›„ shell ์ƒ์—์„œ cat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ โ€test3" file์˜ ๋‚ด์šฉ์„ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž โ€™K'๊ฐ€ 10๊ฐœ๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main(){
        char ch = 'K';
        int i, fd = open("test3", O_WRONLY | O_CREAT | O_EXCL, 0644); // ๊ต์ˆ˜๋‹˜ 0640์œผ๋กœ ํ•˜์…จ์Œ
    
        if(fd < 0){ // or fd == -1, ํ•ญ์ƒ ์˜คํ”ˆ์ด ์ œ๋Œ€๋กœ ๋๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์–ด์•ผ ์ข‹์Œ
            printf("File opening failed");
        }
        else{
            for(i=0;i<10;i++){
                write(fd, &ch, 1);
            }
        }
        return 0;
    }
  • 1-g. ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‹คํ–‰ ์‹œ์ผœ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์—†์ด ์‹คํ–‰์ด ๋˜๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    //1์ฐจ์ ์œผ๋กœ๋Š” ์ž˜ ์—ด๋ฆฌ์ง€๋งŒ, ํ•œ ๋ฒˆ ๋” ์‹คํ–‰์‹œํ‚ค๋ฉด O_EXCL ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฉ”์„ธ์ง€๊ฐ€ ๋œจ๊ฒŒ ๋จ. ๊ทธ๋ ‡๊ฒŒ ์„ค์ •์„ ํ•ด๋†จ์œผ๋‹ˆ๊นŒ
    //File opening failed
  • 1-h. โ€œtest2" file์„ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ openํ•˜๊ณ , ์ •์ˆ˜ 5๊ฐœ๋ฅผ ์ฝ์–ด ์ •์ˆ˜ ๋ฐฐ์—ด data[10]์˜ 0๋ฒˆ๋ถ€ํ„ฐ 4๋ฒˆ ์›์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. data[10] ๋ฐฐ์—ด์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. printf() ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ data ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
        int data[10] = {0}, i, fd = open("test2", O_RDONLY);
    
        read(fd, data, 5 * sizeof(int));
    
        for(i=0;i<10;i++) {
            printf("%-5d", data[i]);
        }
    
        return 0;
    }
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” mycopy(์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„)๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

    2-a / b / c. ๋‘ ๊ฐœ์˜ file ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. (scanf() ๋ช…๋ น์„ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.) ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์กด์žฌํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ, ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์— ์“ด๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<string.h>
    
    #define BUFSIZE 512
    
    int main() {
        char file1[100], file2[100], buffer[BUFSIZE];
        int index, user_input, fd1, fd2, nread;
    
        //a. ๋‘ ๊ฐœ์˜ file ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค
        scanf("%100s %100s", file1, file2);
        fflush(stdin);
    
        fd1 = open(file1, O_RDONLY);
    
        if (fd1 == -1) {
            printf("file opening failed");
            return 0;
        } else {
        //c. ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์กด์žฌํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์— ์“ด๋‹ค
            fd2 = open(file2, O_WRONLY | O_CREAT | O_EXCL, 0600);
            nread = read(fd1, buffer, BUFSIZE);
            while (nread > 0) {
                write(fd2, buffer, nread);
                nread = read(fd1, buffer, BUFSIZE);
            }
        }
    }
  • 2-d / e. ๋งŒ์•ฝ, ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด, file ๋ณต์‚ฌ ์ „์— ๊ฒฝ๊ณ  message๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ฒฝ๊ณ  message ํ›„ ์ •์ˆ˜ 1์„ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด, ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋งŒ์•ฝ, ์ •์ˆ˜ 1 ์ด์™ธ์˜ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด ๋ณต์‚ฌ๋ฅผ ํฌ๊ธฐ ํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ , ์ •์ˆ˜ 1์ด ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ, ๊ธฐ์กด file์˜ ๋‚ด์šฉ์€ ์ง€์šฐ๊ณ , ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์„ ๋ณต์‚ฌํ•œ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    #define BUFSIZE 512
    
    int main() {
        char file1[100], file2[100], buffer[BUFSIZE];
        int index, user_input, fd1, fd2, nread;
    
        //a. ๋‘ ๊ฐœ์˜ file ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค
        scanf("%100s %100s", file1, file2);
        fflush(stdin);
    
        fd1 = open(file1, O_RDONLY);
    
        //b. ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค
        if (fd1 == -1) {
            printf("file opening failed\n");
            return 0;
        } else {
            //c. ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์กด์žฌํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ, ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์— ์“ด๋‹ค
            //d. ๋งŒ์•ฝ, ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์˜ file์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด, file ๋ณต์‚ฌ ์ „์— ๊ฒฝ๊ณ  message๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ฒฝ๊ณ  message ํ›„ ์ •์ˆ˜ 1์„ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค
            //๋งŒ์•ฝ ์ •์ˆ˜ 1 ์ด์™ธ์˜ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด ๋ณต์‚ฌ๋ฅผ ํฌ๊ธฐํ•œ๋‹ค
    
            fd2 = open(file2, O_WRONLY | O_CREAT | O_EXCL, 0600);
    
            //๋‘ ๋ฒˆ์งธ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
            if(fd2 == -1){
                printf("Warning : Existing file can be modified. Are you sure to overwrite the file?\n");
                scanf("%d", &user_input);
    
                if(user_input == 1){
                    //overwrite ๋™์˜ํ•ด์„œ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ
                    fd2 = open(file2, O_WRONLY | O_CREAT | O_TRUNC, 0600);
                } else{
                    printf("terminating");
                    return 0;
                }
            }
    
            //๋ณต์‚ฌ ์ˆ˜ํ–‰
            nread = read(fd1, buffer, BUFSIZE);
            while(nread > 0){
                write(fd2, buffer, nread);
                nread = read(fd1, buffer, BUFSIZE);
            }
        }
    
        return 0;
    }

    mycopy ์‹ค์Šต ์š”์ 

    nread = read(fd1, buffer, BUFSIZE);
    while(nread > 0) {
    		write(fd2, buffer, nread);
    		nread = read(fd1, buffer, BUFSIZE);
    }
    • ์ด๋ ‡๊ฒŒ nread ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ writeํ•˜๋Š” ์ด์œ  : writeํ•  ๋•Œ 512 byte ๋‹จ์œ„๋กœ ๋ฐ›์•„์˜ค๋Š”๋ฐ, 512 ๊ทธ๋Œ€๋กœ writeํ•˜๋ฉด (๋งˆ์ง€๋ง‰ 512byte์—์„œ 512๋งŒํผ ๋‹ค ์•ˆ ์ฑ„์›Œ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ถˆํ•„์š”ํ•œ ์•„๋ฌด ๊ฒƒ๋„ ์•ˆ ์—†๋Š” ์“ฐ๋ ˆ๊ธฐ ๋ถ€๋ถ„๋งˆ์ € write๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—) copy ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํŒŒ์ผ์ด ๋” ์ปค์ ธ์„œ ๋‚ด์šฉ์ด ๋ณต์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ nread๋ผ๋Š” ๋ณ€์ˆ˜์— read()ํ•œ๋งŒํผ์˜ byte๋ฅผ ์ €์žฅํ•ด์„œ ๊ทธ๋งŒํผ๋งŒ write๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    • read return๊ฐ’

      • ์„ฑ๊ณต์‹œ ์‹ค์ œ์ฝํžŒ byte ์ˆ˜ / ์‹คํŒจ์‹œ -1
      • return ๊ฐ’ < nbytes์ด๋ฉด, ํŒŒ์ผ์— ๋‚จ์€ data๊ฐ€ nbytes๋ณด๋‹ค ์ ์€ ๊ฒฝ์šฐ
      • ๋” ์ด์ƒ ์ฝ์„ ๋‚ด์šฉ์ด ์—†์œผ๋ฉด return ๊ฐ’์€ 0
      • ํ˜น์‹œ๋‚˜ -1์ด ๋ฐ˜ํ™˜์ด ๋˜๋Š” ๊ฒฝ์šฐ read์— ์‹คํŒจํ•œ๊ฑด๋ฐ, ์—†๋Š” ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ open ์ž˜๋ชปํ–ˆ์„ ๋•Œ -1์„ return ํ•˜๋‹ˆ๊นŒ ์–ด๋””์„œ -1์„ return ํ•˜๋Š”์ง€ ์ž˜ ํ™•์ธํ•ด๋ณด๊ธฐ
      • ์ด๊ฑธ๋กœ ํŒŒ์ผ์—์„œ ๋” ์ฝ์„๊ฒŒ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒŒ์•…ํ•˜๋ฉด ๋จ
    • write return ๊ฐ’

      • ๋ณดํ†ต์€ return๊ฐ’ = n
      • return ๊ฐ’ < n์ด๋ฉด, ์“ฐ๋Š” ๋„์ค‘ media๊ฐ€ full
      • ๋งŒ์•ฝ ์“ฐ๊ธฐ ์ „์— ๊ฝ‰ ์ฐจ๋ฉด -1 return
      • ์ฐธ๊ณ  ์ฝ”๋“œ
      #define BUFSIZE 512
      #define PERM 0644
      
      //name1์„ name2๋กœ ๋ณต์‚ฌํ•œ๋‹ค
      int copyfile(const char *name1, const char *name2) {
          int infile, outfile;
          ssize_t nread;
          char buffer[BUFSIZE];
      
          if((infile = open(name1, O_RDONLY)) == -1)
              return -1;
      
          if((outfile = open(name2, O_WRONLY | O_CREAT | O_TRUNC, PERM)) == -1) {
              close(infile);
              return -2;
          }
      
          //name1์œผ๋กœ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ์— BUFSIZE ๋ฌธ์ž๋ฅผ ์ฝ๋Š”๋‹ค
          while((nread = read(infile, buffer, BUFSIZE)) > 0) {
              //buffer๋ฅผ ์ถœ๋ ฅ ํ™”์ผ์— ์“ด๋‹ค
              if(write(outfile, buffer, nread) < nread) {
                  close(infile);
                  close(outfile);
                  //์“ฐ๊ธฐ์˜ค๋ฅ˜
                  return -3;
              }
      
              close(infile);
              close(outfile);
      
              if(nread == -1) //๋งˆ์ง€๋ง‰ ์ฝ๊ธฐ์—์„œ ์˜ค๋ฅ˜
                  return -4;
              else            //copy ์™„๋ฃŒ
                  return 0;
          }
      }

20180910

  • p3-1. ์•„๋ž˜ ์ฝ”๋ฉ˜ํŠธ ๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ, 10๊ฐœ์˜ ์ •์ˆ˜๋ฅผ data1[] ๋ฐฐ์—ด์— ์ž…๋ ฅ๋ฐ›์•„ ํŒŒ์ผ์— ์ €์žฅ ํ•œ ํ›„, ๋‹ค์‹œ ํŒŒ์ผ์—์„œ ์ฝ์€ 10๊ฐœ์˜ ์ •์ˆ˜๋ฅผ data2[] ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ , ๋‘ ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค. lseek() ๋ช…๋ น์„ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    
    int main(void){
        int i, fd, data1[10], data2[10];
    
        for (i=0;i<10;i++){
            scanf("%d", &data1[i]);
        }
        fd = open("data1", O_RDWR | O_CREAT, 0600);
        // ๋ฐฐ์—ด data1[]์— ์ €์žฅ ๋œ ์ •์ˆ˜๋ฅผ โ€œdata1" ํŒŒ์ผ์— ์ €์žฅํ•œ๋‹ค.
        write(fd, data1, 10 * sizeof(int));
        //์“ฐ๊ณ ๋‚˜๋ฉด ํŒŒ์ผ ํฌ์ธํ„ฐ๊ฐ€ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๊ฐ€์žˆ๊ธฐ ๋•Œ๋ฌธ์— lseek์‚ฌ์šฉํ•ด์„œ ํฌ์ธํ„ฐ ์œ„์น˜ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋จ
        lseek(fd, 0, SEEK_SET);
        // โ€œdata1" ํŒŒ์ผ์— ์ €์žฅ๋œ ์ •์ˆ˜๋ฅผ ์ฝ์–ด data2[] ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
        read(fd, data2, 10 * sizeof(int));
        
        for (i=0;i<10;i++){
            printf("%-5d", data1[i]);
        }
        printf("\n");
        for (i=0;i<10;i++){
            printf("%-5d", data2[i]);
        }
        printf("\n");
    
        return 0;
    }
  • p3-2.

    • ์ฝ๊ธฐ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ "data2" file์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฌธ์ž โ€˜X'๋ฅผ 10๊ฐœ ์”๋‹ˆ๋‹ค.
    • "data2" file์˜ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜๋กœ file pointer๋ฅผ ์˜ฎ๊ธด ํ›„ ๋ฌธ์ž โ€˜Y'๋ฅผ ํ•˜๋‚˜ ์”๋‹ˆ๋‹ค.
    • "data2" file์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋กœ file pointer๋ฅผ ์˜ฎ๊ธด ํ›„ ๋ฌธ์ž โ€˜Y'๋ฅผ ํ•˜๋‚˜ ์”๋‹ˆ๋‹ค.
    • "data2" file์˜ 2, 4, 6, 8๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ โ€˜Z'๋กœ ๋ฐ”๊พธ์–ด ์”๋‹ˆ๋‹ค.
    • "data2" file์˜ 15๋ฒˆ์งธ ์œ„์น˜์— ๋ฌธ์ž โ€˜T'๋ฅผ ์”๋‹ˆ๋‹ค.
    • "data2" file์˜ ๋’ค์—์„œ 2๋ฒˆ์งธ ์œ„์น˜์— ๋ฌธ์ž โ€˜S'๋ฅผ ์”๋‹ˆ๋‹ค.
    • 'S' ๋ฐ”๋กœ ์•ž์— ๋ฌธ์ž โ€˜W'๋ฅผ ์”๋‹ˆ๋‹ค.
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ›„ cat ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ โ€œdata2" file์˜ ๋‚ด์šฉ์ด โ€YZXZXZXZXXYWSTโ€œ ์ธ์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. vi ๋ช…๋ น์œผ๋กœ โ€data" file์˜ ๋‚ด์šฉ์„ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. cat ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•œ ๋‚ด์šฉ๊ณผ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช… ํ•˜์‹œ์˜ค.
  #include<stdio.h>
  #include<sys/types.h>
  #include<sys/stat.h>
  #include<fcntl.h>
  #include<unistd.h>
  
int main(){
      int fd, i;
      char ch;
      ch = 'X';

      fd = open("data2", O_RDWR | O_CREAT | O_TRUNC, 0600);

      for(i=0;i<10;i++){
        write(fd, &ch, sizeof(char));
      }
  
      lseek(fd, 0, SEEK_SET);
    write(fd, "Y", sizeof(char));
  
      lseek(fd, 0, SEEK_END);
    write(fd, "Y", sizeof(char));
  
      for(i=1;i<8;i+=2){
        lseek(fd, i, SEEK_SET);
          write(fd, "Z", sizeof(char));
      }
  
      lseek(fd, 14, SEEK_SET);
    write(fd, "T", sizeof(char));
  
      lseek(fd, -2, SEEK_END);
    write(fd, "S", sizeof(char));
  
      lseek(fd, -2, SEEK_CUR);
    write(fd, "W", sizeof(char));
  
      return 0;
}
  • ๊ฒฐ๊ณผ

    • index 0๋ถ€ํ„ฐ 14 ์œ„์น˜๊นŒ์ง€ ๋ฌธ์ž๋ฅผ ์ผ์ง€๋งŒ cat ๋ช…๋ น์œผ๋กœ data2๋ฅผ ๋ณด๋ฉด 14๊ฐœ์˜ ๋ฌธ์ž๋งŒ ์ถœ๋ ฅ์ด ๋˜๊ณ , vi ๋ช…๋ น์œผ๋กœ ํŒŒ์ผ์„ ๋ณด๋ฉด ์ค‘๊ฐ„์— ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค
  • index 11 ์œ„์น˜์—๋Š” ๋ฐ์ดํ„ฐ ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— cat ๋ช…๋ น์œผ๋กœ๋Š” ์•„์˜ˆ ์ถœ๋ ฅ์ด ์•ˆ ๋œ ๊ฒƒ์ด๊ณ , vi ๋ช…๋ น์œผ๋กœ๋Š” ๋นˆ ๊ฐ’์„ ๋œปํ•˜๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋œ ๊ฒƒ์ž„

//cat data2
YZXZXZXZXXYWST

//vi data2
YZXZXZXZXXY^@WST

P3-2 ์‹ค์Šต์—์„œ ์š”์  ๋ฐ ์ฃผ์˜ํ•  ์ 

  • SEEK_END๋Š” ํ•ญ์ƒ ๋งจ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ๋‹ค์Œ ์œ„์น˜๋กœ ์œ„์น˜ํ•œ๋‹ค
  • ํฌ์ธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์“ด ํ›„, ๊ทธ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์—ฌ์งˆ ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค
    • ๋์—์„œ ๋‘ ๋ฒˆ์งธ ์œ„์น˜์— ๋ฌธ์ž๋ฅผ ์“ฐ๋ผ๊ณ  ํ•˜๋ฉด -2๋ฅผ ํ•˜๋Š” ์ด์œ ๊ฐ€ SEEK_END๋Š” ํ•ญ์ƒ ๋งจ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ๋‹ค์Œ ์œ„์น˜๋กœ ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ

20180912

  • p3-3.c data1 ๋ฐฐ์—ด์˜ 0-4๋ฒˆ์งธ ์ •์ˆ˜๋ฅผ โ€œdata3" ํŒŒ์ผ์˜ 0, 2, 4, 6, 8๋ฒˆ์งธ ์œ„์น˜์— ์ €์žฅ data1 ๋ฐฐ์—ด์˜ 5-9๋ฒˆ์งธ ์ •์ˆ˜๋ฅผ โ€œdata3" ํŒŒ์ผ์˜ 1, 3, 5, 7, 9๋ฒˆ์งธ ์œ„์น˜์— ์ €์žฅ "data3" ํŒŒ์ผ์— ์ €์žฅ๋œ ์ •์ˆ˜ 10๊ฐœ๋ฅผ ์ฝ์–ด data2 ๋ฐฐ์—ด์— ์ €์žฅ

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main() {
      int i, fd, k, k1, data1[10], data2[10];
    
      fd=open("data3", O_RDWR|O_CREAT|O_TRUNC, 0600);
    
      for (i=0;i<10;i++) {
            scanf("%d", &data1[i]);
        }
    
      for(i=0;i<5;i++) {
            write(fd, data1 + i, sizeof(int));
            lseek(fd, 4, SEEK_CUR);
        }
    
      for(i=9;i>4;i--) {
            lseek(fd, -4, SEEK_CUR);
            write(fd, data1 + i, sizeof(int));
            lseek(fd, -8, SEEK_CUR);
        }
    
      read(fd, data2, 10 * sizeof(int));
    
      for (i=0;i<10;i++) {
            printf("%-5d", data1[i]);
        }
    
      printf("\n");
    
      for (i=0;i<10;i++) {
            printf("%-5d", data2[i]);
        }
      
      printf("\n");
        return 0;

}


๊ต์ˆ˜๋‹˜ ๋‹ต์•ˆ

```C
int main(void){
    
    int i, fd, k, k1, data1[10], data2[10];

    fd=open("data3", O_RDWR|O_CREAT|O_TRUNC, 0600);

    for (i=0;i<10;i++){
      scanf("%d", &data1[i]);
    }

    for(i=0;i<5;i++){
      write(fd, data1 + i, sizeof(int));
        lseek(fd, sizeof(int), SEEK_CUR);
    }

    lseek(fd, -9 * sizeof(int), SEEK_CUR);

    for(i=5;i<10;i++){
      write(fd, data1 + i, sizeof(int));
        lseek(fd, sizeof(int), SEEK_CUR);
    }

    lseek(fd, 0, SEEK_SET);

    read(fd, data2, 10 * sizeof(int));

    for (i=0;i<10;i++) {
      printf("%-5d", data1[i]);
    }

    printf("\n");

    for (i=0;i<10;i++){
      printf("%-5d", data2[i]);
    }

    printf("\n");

    return 0;
}

int๋Š” 4byte์”ฉ ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์—ฌ์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•  ๊ฒƒ ์ฒ˜์Œ ํŒŒ์ผ ํฌ์ธํ„ฐ๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ int ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋ฅผ ์“ฐ๋ฉด, ํฌ์ธํ„ฐ๋Š” 0123๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ๊ทธ ๋‹ค์Œ ์“ฐ์—ฌ์งˆ 4์— ํฌ์ธํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ๋‹ค array[0] 0 1 2 3 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[1] 4 5 6 7 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[2] 8 9 10 11 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[3] 11 12 13 14 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[4] 15 16 17 18 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[5] 19 20 21 22 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[6] 23 24 25 26 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[7] 27 28 29 30 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[8] 31 32 33 34 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ array[9] 35 36 37 38 ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜

  • p4-1 stat() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ "p1.c" ํŒŒ์ผ์˜ acess permission, link ์ˆ˜, ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

    int main() {
      struct stat buffer;
        stat("data", &buffer);
    
      printf("%o\n%d\n%ld\n", buffer.st_mode&0777, buffer.st_nlink, buffer.st_size);
        return 0;

}



- p4-2
access() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ โ€œdata1"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€, ์กด์žฌ ํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์— ์˜ํ•œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์ธ์ง€๋ฅผ ์•Œ์•„๋ณด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

```C
int main() {
  struct stat buffer;

  if(access("data1", F_OK) == 0) {
        if(access("data1", R_OK | W_OK) == 0) {
            printf("ํŒŒ์ผ ์กด์žฌ, ์ฝ๊ธฐ ์“ฐ๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ\n");
        } else {
            printf("ํŒŒ์ผ ์กด์žฌ, ์ฝ๊ธฐ ์“ฐ๊ธฐ ๋ถˆ๊ฐ€\n");
        }
    } else {
        printf("ํŒŒ์ผ ์กด์žฌํ•˜์ง€ ์•Š์Œ\n");
    }

  return 0;
}
  • p4-3 scanf()๋กœ ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ ๋ฐ›์€ ํ›„, link() ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด file์— ์ƒˆ๋กœ์šด link๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค. Shell ์ƒ์—์„œ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œ์ผœ, โ€œp1.c" ํŒŒ์ผ์— โ€abc"๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ๋กœ ์šด link๋ฅผ ์ƒ์„ฑ ํ•œ ํ›„, ls -l ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ link๋ฅผ ํ™•์ธ ํ•˜์‹œ์˜ค.

    int main() {
      char name1[100], name2[100];
        scanf("%100s %100s", name1, name2);
        fflush(stdin);
        link(name1, name2);
      return 0;
    }
  
- p4-4
  scanf()๋กœ ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ ๋ฐ›์€ ํ›„, symlink() ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด file์— symbolic link๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค. Shell ์ƒ์—์„œ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œ์ผœ, โ€œp1.c" ํŒŒ์ผ์— โ€def"๋ผ๋Š” ์ด๋ฆ„ ์˜ ์ƒˆ๋กœ์šด symbolic link๋ฅผ ์ƒ์„ฑ ํ•œ ํ›„, ls -l ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ symbolic link๋ฅผ ํ™•์ธ ํ•˜์‹œ์˜ค. link์™€ symbolic link์˜ ์ฐจ์ด๋ฅผ ํ™•์ธ ํ•ด ๋ด…๋‹ˆ๋‹ค.

  ```C
  int main() {
    char name1[100], name2[100];
      scanf("%100s %100s", name1, name2);
      fflush(stdin);
      symlink(name1, name2);
    return 0;
  }
  • p4-5 Shell ์ƒ์—์„œ ๋””๋ ‰ํ† ๋ฆฌ, A/B/C๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. 4๋ฒˆ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•ด์„œ ๋””๋ ‰ํ† ๋ฆฌ A/B/C์— ๋Œ€ํ•œ symbolic link T๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Shell ์ƒ์—์„œ ๋””๋ ‰ํ† ๋ฆฌ T์— data1 ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ A/B/C์—๋„ data1์ด ์ƒ์„ฑ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.

    ํ•ฉ๊ณ„ 116
    drwxr-xr-x. 3 s13011022 class 4096  9์›” 12 20:13 A
    lrwxrwxrwx. 1 s13011022 class    5  9์›” 17 21:10 T -> A/B/C
    -rwxr-xr-x. 1 s13011022 class 8632  9์›” 12 16:55 a.out
    -rw-r--r--. 2 s13011022 class    0  9์›” 17 20:56 abc
    -rw-r--r--. 1 s13011022 class    6  9์›” 12 16:55 data
    -rw-r--r--. 1 s13011022 class    5  9์›” 17 20:47 data1
    lrwxrwxrwx. 1 s13011022 class    4  9์›” 17 20:58 def -> p1.c
    -rw-r--r--. 1 s13011022 class  306  9์›” 12 16:55 example.c
    -rw-r--r--. 1 s13011022 class  244  9์›” 17 12:31 link.c
    -rwxr-xr-x. 1 s13011022 class 8520  9์›” 17 12:31 link.out
    -rw-r--r--. 2 s13011022 class    0  9์›” 17 20:56 p1.c
    -rw-r--r--. 1 s13011022 class  303  9์›” 17 20:41 p4-1.c
    -rwxr-xr-x. 1 s13011022 class 8632  9์›” 17 20:37 p4-1.out
    -rw-r--r--. 1 s13011022 class  458  9์›” 17 20:49 p4-2.c
    -rwxr-xr-x. 1 s13011022 class 8568  9์›” 17 20:48 p4-2.out
    -rw-r--r--. 1 s13011022 class  283  9์›” 17 20:57 p4-3.c
    -rwxr-xr-x. 1 s13011022 class 8664  9์›” 17 20:55 p4-3.out
    -rw-r--r--. 1 s13011022 class  249  9์›” 17 21:10 p4-4.c
    -rwxr-xr-x. 1 s13011022 class 8672  9์›” 17 21:10 p4-4.out
    -rw-r--r--. 3 s13011022 class    7  9์›” 12 20:45 test1
    -rw-r--r--. 3 s13011022 class    7  9์›” 12 20:45 test2
    lrwxrwxrwx. 1 s13011022 class    5  9์›” 12 20:42 test_sym -> test1
    • ./p4-4.out ์‹คํ–‰ ํ›„ A/B/C T ์ž…๋ ฅํ•˜๊ณ  ls -l ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์œ„์—์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋จ
    • ๊ทผ๋ฐ ๋ณด๋ฉด A/B/C๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ผ drwxrwxโ€”์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ, T๋Š” lrwxrwx--- ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋œ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ผ๋Š” ์˜๋ฏธ์ž„. ๊ทธ๋ž˜์„œ T๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
    • ํ•˜์ง€๋งŒ! cd T ๋ผ๋Š” ๋ช…๋ น์ด ์ˆ˜ํ–‰์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  T ๋‚ด๋ถ€์— vi data1์„ ๋งŒ๋“ค๊ณ , A/B/C๋กœ ์ด๋™ํ•ด์„œ ๋ณด๋ฉด T์—์„œ ๋งŒ๋“  data1์ด ๋˜‘๊ฐ™์ด ์ƒ์„ฑ์ด ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์‹ค data1์ด ๋˜‘๊ฐ™์ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, T๋Š” A/B/C ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” symbolic link์ด๊ธฐ ๋•Œ๋ฌธ์— A/B/C์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ณ , T์—์„œ ์ž‘์—…์€ A/B/C์—์„œ์˜ ์ž‘์—…์ธ ๊ฒƒ์ด๋‹ค.

    ์ฃผ์˜! symbolic link๊ฐ€ ๊ฐ€์ง€๋Š” ์ด๋ฆ„ํ‘œ์˜ ์ง„์‹ค

    • p1.c ํŒŒ์ผ ์ƒ์„ฑ ํ›„

      link("p1.c", "p1_link.c")
      symlink("p1.c", "p1_symlink.c")
    • ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด p1_symlink.c ํŒŒ์ผ์€ p1.c๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด๋ฆ„ํ‘œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ p1_symlink.c ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด p1.c๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค

  • ๊ทผ๋ฐ p1_symlink.c๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” p1.c์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด p1_symlink.c๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ls -l ๋ช…๋ น์„ ํ•˜๋ฉด ์•Œ๋ ค์ค€๋‹ค

  • symbolic link๊ฐ€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ์ด๋ฉด ์ด๋ฆ„์ด ๋ณ€๊ฒฝ์ด ๋˜์–ด๋„ ์ƒ๊ด€์ด ์—†์ง€๋งŒ, ์˜ค๋กœ์ง€ ์ด๋ฆ„์˜ ๊ฐ’๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค

  • ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋กœ์ง€ ์ด๋ฆ„ํ‘œ

  • p4-6 symbolic link ์ด๋ฆ„์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ํ•ด๋‹น symbolic link ์ž์ฒด์— ๋Œ€ํ•œ stat ์ •๋ณด ์ค‘ access permission, ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ symbolic link ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๊ณ , ๋˜ํ•œ symbolic link๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ file ์˜ stat ์ •๋ณด ์ค‘ access permission, ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์‹ค์ œ file ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜ ์‹œ์˜ค.

    int main() {
      struct stat symlink_buffer, original_buffer;
        char symlink_file[100], ch[100] = {0}, original_file[100];
    
        scanf("%100s", symlink_file);
      fflush(stdin);
    
        readlink(symlink_file, original_file, 99);
    
        lstat(symlink_file, &symlink_buffer);
      stat(original_file, &original_buffer);
    
        printf("[symbolic file][%s] access permission : %o, file size : %ld\n", symlink_file, symlink_buffer.st_mode&0777, symlink_buffer.st_size);
      printf("[original file][%s] access permission : %o, file size : %ld\n", original_file, original_buffer.st_mode&0777, original_buffer.st_size);
    
        return 0;

}


stat(test, ~)	: test ์ •๋ณด๋ง๊ณ  test๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” A/B/C/test์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ค€๋‹ค. Symbolic link์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์ง€ ๋ชปํ•จ
lstat(test, ~)	: symbolic link ์ž์ฒด ํŒŒ์ผ ์ •๋ณด๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

- p4-7
Shell์—์„œ ls -l ๋ช…๋ น์— ์˜ํ•ด ์ถœ๋ ฅ๋˜๋Š” ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ž‘์„ฑ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์•Œ ๊ณ  ์‹ถ์€ ํŒŒ์ผ ์ด๋ฆ„์„ read ์‹œ์Šคํ…œ ์ฝœ๋กœ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ํ•ด๋‹น ํŒŒ์ผ์˜ ์ •๋ณด๋“ค ์ค‘, access permission, link ์ˆ˜, user id, group id, ํŒŒ์ผ ํฌ๊ธฐ, ํŒŒ์ผ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ update ํ•œ ๋‚ ์งœ, ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ ์ด๋ฆ„์„ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ด€๋ จ ์ •๋ณด ์ค‘, access permission์€ 8์ง„์ˆ˜๋กœ, user id์™€ group id๋Š” ์ •์ˆ˜๋กœ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ctime(&์‹œ๊ฐ„์ •๋ณด์ €์žฅ์žฅ์†Œ) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ ๋‹ˆ๋‹ค. ctime() ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ #include<time.h>๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

```C
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<time.h>

#define BUFSIZE 512

int main() {
  struct stat buffer;
    char file[BUFSIZE], dir[BUFSIZE], time[BUFSIZE];

  int n = read(0, file, BUFSIZE);

  file[n-1] = '\0';

  // file ์กด์žฌ ์—ฌ๋ถ€ ํŒŒ์•…
    if(stat(file, &buffer) < 0) {
        perror("stat");
        return -1;
    }

  // symlink ํŒŒ์ผ ์—ฌ๋ถ€ ํŒŒ์•…
    if(readlink(file, dir, BUFSIZE) >= 0) {
        lstat(file, &buffer);
    }

  strcpy(time, ctime(&buffer.st_mtime));
    n = strlen(time);
    time[n-1] = '\0';

  printf("%o ", buffer.st_mode&0777);
    printf("%d ", buffer.st_nlink);
    printf("%d ", buffer.st_uid);
    printf("%d ", buffer.st_gid);
    printf("%ld ", buffer.st_size);
    printf("%s ", time);
    printf("%s ", file);
    printf("%s\n", (S_ISLNK(buffer.st_mode)) ? "symbolic link" : "");

  return 0;
}
  • ์ผ๋‹จ read(0, file, 100); ํ‘œ์ค€ ์ž…๋ ฅ ๋ฐ›์„ ์‹œ, \n ๋‰ด๋ผ์ธ๋„ ์ž…๋ ฅ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ ์ฃผ์˜ํ•  ๊ฒƒ ๊ทธ๋ž˜์„œ \n ๋‰ด๋ผ์ธ์„ null๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ–ˆ์Œ
    • ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ if(stat(file, &buffer) < 0)์œผ๋กœ ํŒ๋ณ„ํ–ˆ์Œ
    • Link / symlink ์—ฌ๋ถ€๋ฅผ if(readlink(file, dir, 100) >= 0)๋กœ ๋งž์œผ๋ฉด symlink๋กœ ํŒ๋ณ„ํ–ˆ์Œ
    • ๊ต์ˆ˜๋‹˜ ๋‹ต์•ˆ read(0, file, 100) ์‚ฌ์šฉ ์‹œ ๋งจ ๋งˆ์ง€๋ง‰ ์—”ํ„ฐ ์ž…๋ ฅ๋„ \n ์œผ๋กœ ์ž…๋ ฅ๋ฐ›์œผ๋‹ˆ๊นŒ \0 null๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹ฌ ์ˆ˜์ • ์‹œ๊ฐ„ ์ฝ์–ด์™€์„œ ctimeํ•จ์ˆ˜๋กœ ๋ฌธ์ž์—ด๋กœ ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ๋งจ ๋งˆ์ง€๋ง‰์— \n์ด ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ์ด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ๋ง์”€ํ•˜์‹ฌ ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ link/symlink ์—ฌ๋ถ€๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•˜์Œ

20180919

  • p5-1. ์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ shell์—์„œ ์‚ฌ์šฉํ•˜๋Š” cd ๋ช…๋ น๊ณผ ls ๋ช…๋ น์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. change_directory() ํ•จ์ˆ˜์™€ list() ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ์™„์„ฑ ํ•˜์‹œ์˜ค. ๋˜ํ•œ, ๋ช…๋ น ์ž…๋ ฅ ๋Œ€๊ธฐ ์‹œ ํ˜„์žฌ directory ์ด๋ฆ„์ด ์ถœ๋ ฅ ๋˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

    #define BUFSIZE 512
    
    void change_directory(char *name) {
        chdir(name);
    }
    
    void list() {
        DIR *dp;
        struct dirent *d;
        dp = opendir(".");
        while((d = readdir(dp)) != NULL) {
            if(d->d_name[0] != '.') {
                printf("%ld : %s \n", d->d_ino, d->d_name);
            }
        }
    }
    
    int main() {
      char name[BUFSIZE];
    
      while(1) {
            getcwd(name, BUFSIZE);
            printf("[ %s ]$ ", name);
            scanf("%s", name);
        
            if (strcmp(name, "cd") == 0) {
                scanf("%s", name);
                change_directory(name);
            } else if (strcmp(name, "ls") == 0) {
              	list();
            } else {
    	          break;
            }
        }
        return 0;
    }
  • p5-2. Current working directory ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด ls -l ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ ๊ด€๋ จ ์ •๋ณด ์ค‘, access permission, link ์ˆ˜, user id, group id, ํŒŒ์ผ ๋ฐ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์˜ ํฌ๊ธฐ, ํŒŒ์ผ ๋ฐ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ update ํ•œ ๋‚ ์งœ, ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ ๋ฐ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์ •๋ณด ์ค‘, access permission์€ 8์ง„์ˆ˜๋กœ, user id์™€ group id๋Š” ์ •์ˆ˜๋กœ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์€ โ€˜F'๋กœ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋Š” โ€™D'๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    #define BUFSIZE 512
    
    int main() {
      struct stat buffer;
        char file[BUFSIZE], time[BUFSIZE];
        int n;
    
      DIR *dp;
        struct dirent *d;
        dp = opendir(".");
        while((d = readdir(dp)) != NULL) {
            if(d->d_name[0] != '.') {
              stat(d->d_name, &buffer);
    
              if(S_ISREG(buffer.st_mode)) {
                    printf("F");
              } else {
                    printf("D");
                }
    
                strcpy(time, ctime(&buffer.st_mtime));
                n = strlen(time);
              time[n-1] = '\0';
    
                printf("%o ", buffer.st_mode&0777);
                printf("%d ", buffer.st_nlink);
              printf("%d ", buffer.st_uid);
                printf("%d ", buffer.st_gid);
                printf("%ld ", buffer.st_size);
                printf("%s ", time);
                printf("%s ", d->d_name);
                printf("%s\n", (S_ISLNK(buffer.st_mode)) ? "symbolic link" : "");
            }
        }
        return 0;
    }
    F644 1 5102 5000 1092 Wed Sep 19 20:04:34 2018 p5-2.c 
    

F755 1 5102 5000 8904 Wed Sep 19 19:28:30 2018 p5-1.out F755 1 5102 5000 8592 Wed Sep 19 13:02:23 2018 p5-3.out F644 1 5102 5000 808 Wed Sep 19 19:28:22 2018 p5-1.c F755 1 5102 5000 8624 Mon Sep 17 23:10:49 2018 example.out F644 1 5102 5000 510 Wed Sep 19 13:06:33 2018 p5-3.c F755 1 5102 5000 8992 Wed Sep 19 20:04:44 2018 p5-2.out D700 3 5102 5000 4096 Mon Sep 17 22:41:06 2018 T1 F644 1 5102 5000 512 Mon Sep 17 23:19:25 2018 example.c


- p5-3.
Current working directory์™€ ๊ทธ์˜ descendent directory๋“ค ์•ˆ์— ์ €์žฅ๋œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋“ค ์— ๋Œ€ํ•ด, ๋””๋ ‰ํ† ๋ฆฌ์™€ ์‹คํ–‰ ํŒŒ์ผ๋“ค๋งŒ ์„ ํƒํ•˜์—ฌ ๊ทธ ์ด๋ฆ„๊ณผ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.
ํžŒํŠธ) S_IXUSR & status->st_mode || S_IXGRP & status->st_mode || S_IXOTH & status->st_mode

```c
int list(const char *name, const struct stat *status, int type) {
  if(type == FTW_D || type == FTW_DNR) {
        printf("%s : %d\n", name, status->st_size);
    } else if(type == FTW_F) {
        if(S_IXUSR & status->st_mode || S_IXGRP & status->st_mode || S_IXOTH & status->st_mode) {
            printf("%s : %d\n", name, status->st_size);
        }
    }
    return 0;
}

int main() {
    ftw(".", list, 1);
  return 0;
}

20181001

  • p6-1.c ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ํ”„๋กœ์„ธ์Šค id, ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน id, session id๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <ftw.h>
    #include <stdlib.h>
    
    int main() {
            pid_t pid;
            pid = fork();
    
            if(pid == 0) {
                printf("%ld : %ld : %ld \n", getpid(), getpgrp(), getsid(getpid()));
            }
    
            return 0;
    }
  • p6-2.c main() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๋ฌธ์ž์—ด 3๊ฐœ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <ftw.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv) {
      int i = 0;
        printf("%d\n", argc);
    
        while(argv[i] != NULL) {
            printf("%s\n", argv[i]);
            i++;
        }
        return 0;
    }
  • P6-3.c main() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„, ํ•ด๋‹น ์ •์ˆ˜ ๋งŒํผ์˜ child ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค. ์ƒ์„ฑ๋œ child ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์˜ ํ”„๋กœ์„ธ์Šค id, ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน id, session id๋ฅผ ์ถœ๋ ฅ ํ•œ ํ›„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <ftw.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv) {
        int i, num;
        pid_t pid;
    
        num = atoi(argv[1]);
    
        for(i=0;i<num;i++) {
            pid = fork();
            if(pid == 0) {
                printf("%ld : %ld : %ld\n", getpid(), getpgrp(), getsid(getpid()));
                exit(0);
            }
        }
    
        for(i=0;i<num;i++) {
            if(pid > 0) {
              	wait(0);
            }
        }
        return 0;
    }
  • p6-4.c main() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ •์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ๋จผ์ € ์ž…๋ ฅ๋ฐ›์€ ์ด๋ฆ„์˜ ํŒŒ์ผ์„ open ํ•œ ํ›„, ํ•ด๋‹น ์ •์ˆ˜ ๋งŒํผ์˜ child ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜์‹œ์˜ค. ์ƒ์„ฑ๋œ child ํ”„๋กœ์„ธ์Šค๋Š” open ๋œ ํŒŒ์ผ์—์„œ 2๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ฝ์–ด ์ž์‹ ์˜ id์™€ ํ•จ๊ป˜ ์ถœ๋ ฅ ํ•œ ํ›„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค. (ํ‘œ์ค€ ์ถœ๋ ฅ์€ printf() ๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.)

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <ftw.h>
    #include <stdlib.h>
    
    #define BUFSIZE 512
    
    int main(int argc, char **argv) {
      int i, num, fd;
        char buffer[BUFSIZE] = {0};
        pid_t pid;
    
      fd = open(argv[1], O_RDONLY);
        num = atoi(argv[2]);
    
      for(i=0;i<num;i++) {
            pid = fork();
            if(pid == 0) {
                read(fd, buffer, 2*sizeof(char));
                printf("%s by %ld\n", buffer, getpid());
                exit(0);
            }
        }
    
      for(i=0;i<num;i++) {
            if(pid > 0) {
                wait(0);
            }
        }
    
      return 0;
    }

buffer[BUFSIZE]๋ฅผ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆ ํ•ด์ฃผ๋ฉด, ๋ฐ์ดํ„ฐ ์ฝ์–ด์™€์„œ ์“ฐ๋ฉด ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋‚˜์˜ด buffer ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์•ˆ ํ•˜๊ณ  ์ฐจ์ด๋ฅผ ์•Œ์•„๋ด์•ผํ•  ๊ฒƒ

  • p7-1a.c main() ํ•จ์ˆ˜์˜ argument๋กœ ๋ฐ›์€ ๋ฌธ์ž์—ด์„ 3ํšŒ ๋ฐ˜๋ณต ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ ์˜ ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์„ "test1"์œผ๋กœ ์„ค์ • ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‹คํ–‰ ํŒŒ์ผ์„ home directory/bin์— ๋ณต์‚ฌํ•˜๊ณ  ํŒŒ ์ผ ์ด๋ฆ„์€ "test2"๋กœ ์„ค์ • ํ•ฉ๋‹ˆ๋‹ค.

    int main(int argc, char **argv) {
      int i,j;
        for(i=0;i<3;i++) {
          for(j=1;argv[j]!=NULL;j++) {
              	printf("%s ", argv[j]);
            }
            printf("\n");
        }
        return 0;
    }
  • p7-1b.c execl() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ current working directory์— ์žˆ๋Š” "test1"์„ ์‹คํ–‰ ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜๊ณ , 3๊ฐœ์˜ ๋ฌธ์ž์—ด, โ€abc", "def", "ghi"๋ฅผ argument๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    int main(int argc, char **argv) {
        execl("./test1", "test1", "abc", "def","ghi", (char*)0);
        exit(1);
        return 0;
    }
    • p7-1c.c execlp() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ home directory/bin์— ์žˆ๋Š” "test2"๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜๊ณ , 3๊ฐœ์˜ ๋ฌธ์ž์—ด, โ€abc", "def", "ghi"๋ฅผ argument๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
          execlp("test2", "test2", "abc", "def", "ghi", (char*)0);
          exit(1);
          return 0;
      }
    • p7-1d.c execv() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ current working directory์— ์žˆ๋Š” "test1"์„ ์‹คํ–‰ ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜๊ณ , 3๊ฐœ์˜ ๋ฌธ์ž์—ด, โ€abc", "def", "ghi"๋ฅผ argument๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
          char *av[5] = {"test1", "abc", "def", "ghi", (char*)0};
          execv("./test1", av);
          exit(1);
      }
    • p7-1e.c execvp() ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ home directory/bin์— ์žˆ๋Š” "test2"๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ํ•˜๊ณ , 3๊ฐœ์˜ ๋ฌธ์ž์—ด, โ€abc", "def", "ghi"๋ฅผ argument๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
          char *av[5] = {"test2", "abc", "def", "ghi", (char*)0};
          execvp("test2", av);
          exit(1);
      }
  • p7-2.c parent process๋Š” 3๊ฐœ์˜ child process๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ child process๊ฐ€ ์ข…๋ฃŒ ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์˜€๋‹ค๊ฐ€ child process์˜ exit() ๊ฐ’์„ ์ถœ๋ ฅ ํ•œ ํ›„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ child process๋Š” ์ˆœ์„œ๋Œ€๋กœ ์•„๋ž˜ 3๊ฐ€์ง€ ํ”„๋กœ๊ทธ ๋žจ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ ์‹œํ‚จ ํ›„ exit()์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค. exit()์˜ ๊ฐ’์€ child process๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ˆœ์„œ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

    int main(int argc, char **argv) {
            int i, status;
            pid_t pid;
    
            for(i=0;i<3;i++) {
                    pid = fork();
                    if(pid == 0 && i == 0) {
                            execl("./p7-2a.out", "p7-2a.out", "1", "abcdef", (char*)0);
                    } else if(pid == 0 && i == 1) {
                            execl("./p7-2b.out", "p7-2b.out", "2", (char*)0);
                    } else if(pid == 0) {
                             execl("./p7-2c.out", "p7-2c.out", "3", (char*)0);
                    }
            }
            for(i=0;i<3;i++) {
                    wait(&status);
                    if(WIFEXITED(status))
                            printf("......%d\n", WEXITSTATUS(status));
            }
            exit(0);
    }
    • p7-2a.c main() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๋ฌธ์ž์—ด์„ 5ํšŒ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋งค ํšŒ ์ถœ๋ ฅ ํ›„ sleep(1) ๋ช…๋ น์œผ๋กœ 1์ดˆ๊ฐ„ ์‰ฝ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
          int i,j;
      
            for(i=0;i<5;i++) {
                    for(j=1;argv[j]!=NULL;j++) {
                              printf("%s ", argv[j]);
                    }
                      printf("\n");
                      sleep(1);
              }
              exit(1);
      }
    • p7-2b.c ํ”„๋กœ์„ธ์Šค id์™€ group id, session id๋ฅผ 5ํšŒ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋งค ํšŒ ์ถœ๋ ฅ ํ›„ sleep(1) ๋ช…๋ น์œผ๋กœ 1์ดˆ๊ฐ„ ์‰ฝ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
            int i;
            for(i=0;i<5;i++) {
                    printf("pid = %d gid = %d sid = %d\n", getpid(), getpgid(0), getsid(getpid()));
                      sleep(1);
            }
              exit(2);
    }
    • p7-2c.c โ€˜A'๋ถ€ํ„ฐ โ€™Z'๊นŒ์ง€ 26๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ์ด ์“ฐ์—ฌ์ง„ โ€œdata" ํŒŒ์ผ์—์„œ ํ•œ ๊ธ€์ž์”ฉ ์ฝ์–ด 10ํšŒ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž…๋‹ˆ๋‹ค. ๋งค ํšŒ ์ถœ๋ ฅ ํ›„ sleep(1) ๋ช…๋ น์œผ๋กœ 1์ดˆ๊ฐ„ ์‰ฝ๋‹ˆ๋‹ค.

      int main(int argc, char **argv) {
          char buffer[BUFSIZE];
              int fd,i;
      
          fd = open("data", O_RDONLY);
      
            for(i=0;i<10;i++) {
                    read(fd, buffer, 1);
                      write(1, buffer, 1);
                      write(1, "\n", 1);
                    sleep(1);
              }
            exit(3);
      }
  • p7-3.c 2๋ฒˆ ํ”„๋กœ๊ทธ๋žจ์—์„œ parent process๊ฐ€ child process์˜ ์ƒ์„ฑ ์ˆœ์„œ์˜ ์—ญ์ˆœ์œผ๋กœ ์ข…๋ฃŒ ๋Œ€๊ธฐ๋ฅผ ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์‹œ์˜ค.

    • WNOHANG ์˜ต์…˜์„ ์ฃผ๋ฉด block์ด ์•ˆ ๋˜๋Š”๊ฑฐ๊ณ , ์•ˆ ์ฃผ๊ณ  0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด blockํ•˜์—ฌ ๋Œ€๊ธฐ
    • wait์€ ํŠน์ • pid ๋ช…์‹œ ์•ˆ ํ•˜๊ณ  ๊ทธ๋ƒฅ ๋๋‚œ ์•„๋ฌด ํ”„๋กœ์„ธ์Šค ์ธ์ง€ํ•˜๊ณ  blockํ•ด์ œ
    • waitpid๋Š” ํŠน์ • pid๋ฅผ ๋Œ€๊ธฐ ๊ฐ€๋Šฅ. blockํ• ์ง€ ์•ˆ ํ• ์ง€๋„ ์„ค์ • ๊ฐ€๋Šฅ
    int main(int argc, char **argv) {
            int i, status;
            pid_t pid[3];
    
            for(i=0;i<3;i++) {
                    pid[i] = fork();
                    if(pid[i] == 0 && i == 0) {
                            execl("./p7-2a.out", "p7-2a.out", "1", "abcdef", (char*)0);
                    }
                    else if(pid[i] == 0 && i == 1) {
                            execl("./p7-2b.out", "p7-2b.out", "2", (char*)0);
                    }
                    else if(pid[i] == 0) {
                            execl("./p7-2c.out", "p7-2c.out", "3", (char*)0);
                    }
            }
    
            //while(waitpid(pid, &status, WNOHANG) == 0){
            //      printf("parent still waiting\n");
            //      sleep(1);
            //}
    
            for(i=2;i>=0;i--) {
                    waitpid(pid[i], &status, 0);
                    if(WIFEXITED(status))
                            printf("......%d\n", WEXITSTATUS(status));
            }
            exit(0);
    }