OS/Linux

APUE 7장 연습문제

badcob 2009. 11. 27. 10:30
연습문제 7.1) linux 에서 "hello, world"를 출력하고 exit 호출이나 return 문이 없을때
프로그램의 종지 상태echo $? 을 쳐보면 13인 것을 알수 있다. 왜그럴까.

Answer) printf의 반환값이 (출력한 문자 개수) main의 반환값이 된것으로 보인다. 
모든 시스템이 이런 행동을 보이는 것은 아니다.

7.3) main 이 어떤 함수를 호출한다고 하자.
a) main 이 그 함수에게 argc와 argv를 넘겨주지 않거나
b) main이 argc와 argv를 전역 변수로 복사하지 않았다고 해도,
그 함수가 명령줄 인수들에 접근하는 것이 가능할까?

Answer) 대부분의 UNIX 시스템들에서, 이는 붕가능하다.
environ 등과는 달리 argc와 argv의 복사본을 어떤 전역 변수들에 담아두지는 않기 때문이다.

아~ 그렇구나~.

7.4) 일부 UNIX 시스템 구현들은 프로그램 실행 시 자료 구역의 0번 위치에
프로세스가 접근하지 못하도록 메모리를 적절히 배치한다. 왜 그럴까?

Answer) 프로세스가 널 포인터를 역참조 해서 프로세스를 종료시키기 위한 것이다.

이건 뭔소리여..

7.7) size 명령의 출력에서 힙과 스택의 크기가 표시되지 않은 이유는 무엇일까?

Answer) exec류 함수들 중 하나로 프로그램이 실행되기 전까지는 할당되지 않는다.

7.10) 함수가 자신의 자동 변수를 가리키는 포인터를 돌려주어서는 안된다는 점을
이야기 한다. 아래 코드에는 문제가 없을까?

int f1(int val)
{
int *ptr;
             if ( val == 0 ) {
                    int val;
                    val = 5;
                    ptr = &val;
              }
              return (*ptr + 1);
}

Answer) 자동 정수 변수 val이 더 이상 존재하지 않게 된 후에도 포인터를 통해서 그 변수를
             참조한다는 문제를 가지고 있다. 하나의 복합문을 사랑하는 왼쪽 꺾음 괄호 이후에
             선언된 자동 변수는 해당 오른쪽 꺾음 괄호까지만 존재하고 그 이후에는 존재하지 않는다.

스택에 쓰면 이런 문제가 있으니깐..  static, extern 또는 malloc를 이용하라규

기본에 충실하고 있슴미.. 진도 참 안나간다.
눈만 잘보였어도..