학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다. / /bin/ /home/ /home/taesoo/ /home/taesoo/downloads /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자 (taesoo) 가터미널에서다음 ls 명령입력시화면출력을예측하시오. $ ls /usr/.. $ cd ~ $ ls. $ pwd 2. 다음프로그램의실행결과를예측하세요. a.c: 실행방법 : $ gcc a.c $./a.out $ cat out
3. 다음그림은프로세스가초기화된후에기본으로만들어진 file table 과 v-node 테이블의연결관계를나타낸다. 다음명령수행후의테이블연결관계를위그림을참고하여도시하시오. int fd1=dup(1); // fd1==3 을가정하시오. 4. 다음 ll 명령의결과를보고아래질문에답하시오. (ll 은 ls -alf 의약자.) $ ll /usr/bin/passwd -rwsr-xr-x 1 root root 71824 Apr 9 2012 /usr/bin/sudo* $ ll /usr/bin/apt-get -rwxr-xr-x 1 root root 192592 Aug 21 07:38 /usr/bin/apt-get* $ ll /usr/bin/whoami -rwxr-xr-x 1 root root 27207 Aug 21 07:38 /usr/bin/whoami* a) 두실행파일 sudo, apt-get 의파일권한이어떻게다른지설명하고, 그래야만하는이유를설명하시오. b) 다음구체적인사용예 ~$ whoami taesoo ~$ sudo apt-get install gcc 에서 whoami 와 sudo 프로세스의 real user 와 effective user 를각각적으시오.
5. Bourne-again 셸 (bash) 은다음과같은표기법을지원한다. n> 파일이름이것은해당파일을연후, 그파일서술자 fd 와같은파일로파일서술자 (file descriptor) n 을재지정하는것이다. 즉시스템호출 dup2(fd, n) 에해당한다. 숫자 n 생략시 n 은 1(stdout) 이다. ( 예 :./a.out > outfile 시 1 번파일서술자는 outfile 을가리킨다.) n>& fd 이것은파일서술자 (file descriptor) n 을파일서술자 fd 와같은파일로재지정하는것이다. 즉 dup2(fd, n) 에해당한다. 그렇다면다음명령수행후 outfile 의내용과화면내용을각각예측하시오. 소스코드 : void main() { fprintf(stderr, err ); fprintf(stdout, out ); } a) $./a.out > outfile b) $./a.out 2> outfile c) $./a.out d)./a.out 2>outfile 1>&2 e)./a.out 2>&1 > outfile ( 힌트 : 셸은주어진명령줄을왼쪽에서오른쪽으로처리한다 )
6. a) 다음명령실행상황을읽어본후아래공란 ( ) 에적절한숫자를적으시오. ~/temp$ umask 777 ~/temp$ touch a ~/temp$ ll total 16 drwx------ 2 taesoo taesoo 4096 Oct 15 16:47./ drwxr-xr-x 137 taesoo taesoo 12288 Oct 15 16:45../ ---------- 1 taesoo taesoo 0 Oct 15 16:47 a ~/temp$ umask ( ) ~/temp$ touch b ~/temp$ ll total 16 drwx------ 2 taesoo taesoo 4096 Oct 15 16:48./ drwxr-xr-x 137 taesoo taesoo 12288 Oct 15 16:45../ ---------- 1 taesoo taesoo 0 Oct 15 16:47 a -r--r--rw- 1 taesoo taesoo 0 Oct 15 16:48 b ~/temp$ ( 힌트 : touch 명령은빈파일을생성함. 파일 a 와파일 b 는파일권한이다름, ll 은 ls -alf 의약자.) b) 파일 a 의 permission( 권한 ) 을파일 b 와동일하게만드려면아래명령을수행해야함. 공란에적절한숫자를적으시오. ~/temp$ chmod ( ) a c) 다음 c 코드수행후셸에서 ll a 입력시결과를예측하시오. chmod( a, S_IRUSR S_IXGRP S_IROTH S_IWOTH); 7. ln b c 명령을사용해서 b 파일을 c 파일로하드링크를건후의 ll 결과이다. total 16 drwx------ 2 taesoo taesoo 4096 Oct 15 17:12./ drwxr-xr-x 137 taesoo taesoo 12288 Oct 15 16:45../ -rw-r--r-- 1 taesoo taesoo 0 Oct 15 16:47 a -rw-r--r-- 2 taesoo taesoo 0 Oct 15 16:48 b -rw-r--r-- 2 taesoo taesoo 0 Oct 15 16:48 c a) 여기서이숫자 2 를 3 으로바꾸는방법을한가지설명하시오. b) c 파일의숫자 2 를 1 로바꾸려면?
8. 사용자가다음프로그램을실행후 1234<enter>asdf<enter>zxcv#0987 의순으로입력을했을때출력을예측하시오. ( 따옴표는입력에포함안됨 ) 사용자가입력한내용과프로그램이출력한내용이콘솔에출력되는모양대로정확히적으시오. Hint: stdin 과 stdout 은기본적으로 linebuffer 임. 9. 위프로그램에서 while 문앞에 char 가 buf[100]; setvbuf(stdout, buf, _IOFBF,100); 명령추가시실행결과어떻게달라질지예측하시오. hint: int setvbuf(file* fp, char* buf, int mode, size_t size); // with setvbuf, we specify exactly which type of buffering we want. 10. setvbuf 함수에서 unbuffered mode (_IOUBF) 를설정한것과동일한효과를얻기위해 fprintf 명령뒤에사용할수있는함수의이름은?
11. 다음프로그램의출력물을예측하시오. ( 컴파일은잘된다고가정 ) jmp_buf jmpbuffer; int main(int argc, char *argv[]) { printf("1\n"); if(setjmp(jmpbuffer)!=0) { printf("2\n"); return 0; } printf("3\n"); while(1) cmd(); printf("4\n"); return 0; } void cmd() { static int i=0; printf("5\n"); i++; if (i==2) longjmp(jmpbuffer, 1); printf("6\n"); } 12. 다음프로그램의출력물을예측하시오. void m1(void) { printf("1\n");} void m2(void) { printf("2\n");} int main(void) { atexit(m1); atexit(m2); atexit(m2); printf("done\n"); return 0; }
13. 아래와같이 file1, file2, file3 의내용이확인되는상황을가정하자. ~/test$ cat file1 file1 ~/test$ cat file2 file2 ~/test$ cat file3 asdf lkj 이때아래명령어의출력결과를예측하시오. ~/test$ cat file3 cat file1 /dev/fd/0 file2 > /dev/fd/1 14. 다음프로그램의실행결과를예측하시오. ( 밑줄부분에답을적으세요 ) $./a.out arg1 TEST foo $ echo $? 15. 하드디스크상의특정파일의내용을복사하는프로그램을작성할때다음두가지방법중하나를써야만한다면, 둘중에어느것이속도가빠를지예측하고, 이유를간단히설명하시오. a) fgetc, fputc 함수를사용해서한바이트씩복사 b) read, write 함수에서 nbytes 값으로 1 사용해서한바이트씩복사참고 : ssize_t read(int filedes, void *buf, size_t nbytes);
16. 아래와같은파일의존성 (dependency 를가정하시오 ) a) fred.c 변경시재생성되어야하는파일들은? b) lib.h 변경시재생성되어야하는파일들은? c) 아래메이크파일의공란에필요한파일이름들을적으세요. program : () gcc o program main.o libfoo.a libfoo.a: ( ) ar crv libfoo.a ( ) main.o : lib.h main.c gcc c main.c bill.o : ( ) gcc c bill.c fred.o : ( ) gcc c fred.c c) (O/X quiz) static library 인 libfoo.a 대신동적라이브러리 (shared library) libfoo.so 를만들어서사용하는경우실행파일 (./program) 의크기가줄어든다. d) static library 인 libfoo.a 대신동적라이브러리 (shared library) libfoo.so 를만들어서사용하는경우의장점을메모리사용량측면에서설명하시오. e) static library 인 libfoo.a 를만들지않고한번에 gcc -o program main.o bill.o fred.o 를실행하면컴파일속도가느려질수있다. 어떤경우에그런지설명하시오. 17. malloc 과 alloca 함수의차이를설명하세요.
18. 다음프로그램실행결과를예측하시오. $./a.out & [1] 7216 $ kill -USR1 7216 $ kill -USR2 7216