-
ํฌ์ธํฐ
#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
-
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; }
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; } }
-
-
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
- SEEK_END๋ ํญ์ ๋งจ ๋ง์ง๋ง ๋ฌธ์ ๋ค์ ์์น๋ก ์์นํ๋ค
- ํฌ์ธํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ด ํ, ๊ทธ ๋ค์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ฌ์ง ์์น๋ก ์ด๋ํ๋ค
- ๋์์ ๋ ๋ฒ์งธ ์์น์ ๋ฌธ์๋ฅผ ์ฐ๋ผ๊ณ ํ๋ฉด -2๋ฅผ ํ๋ ์ด์ ๊ฐ SEEK_END๋ ํญ์ ๋งจ ๋ง์ง๋ง ๋ฌธ์ ๋ค์ ์์น๋ก ์์นํ๊ธฐ ๋๋ฌธ
-
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์์์ ์์ ์ธ ๊ฒ์ด๋ค.
-
p1.c ํ์ผ ์์ฑ ํ
link("p1.c", "p1_link.c")
symlink("p1.c", "p1_symlink.c")
-
์ด๋ ๊ฒ ๋ง๋ค์ด๋์ผ๋ฉด p1_symlink.c ํ์ผ์ p1.c๋ฅผ ๊ฐ๋ฆฌํค๋ ์ด๋ฆํ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๊ทธ๋์ p1_symlink.c ํ์ผ์ ์์ ํ๋ฉด p1.c๋ฅผ ์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค
- ./p4-4.out ์คํ ํ
-
๊ทผ๋ฐ 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 ์ฌ๋ถ๋ ์ ๊ฒฝ์ฐ์ง ์์์
-
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;
}
-
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); }
