1. exec 수행시 p가 있는것과 없는 것의 차이는 무엇일까요? OS는 무엇을 할까요?

exec를 사용하면 exec가 호출한 프로세스의 이미지로 교체됩니다. p를 사용하면 exec의 인자로 넘겨준 실행될 파일 이름을 PATH environment variable을 사용해 찾습니다.



2.command line arguments를 execl과 execv에서는 각각 어떻게 넘겨줄까요? 첫 번째 command line argument는 무엇이 되어야 할까요?


execl에서는 command line argument를 각각 list로 보내줍니다. 즉, argument를 순서대로 하나씩 써서 넘겨줍니다.

반면 execv에서는 command line argument를 argument들의 pointer들의 vector(array)로 보내줍니다.

두 경우 모두 첫 번째 인자는 실행할 파일 이름이 됩니다.



3. exec나 fail이 실패했는지는 어떻게 알 수 있을까요?

fork에 실패하면 return값이 -1이 됩니다. exec는 성공하면 새로운 프로세스 이미지로 교체되므로 exec아래 부분은 실행되지 않습니다. 그러므로 실패한 경우를 대비해 exec 바로 다음에 perror후 exit를 호출하면 실패한 경우를 알 수 있습니다.



4. int *status 포인터는 wait에게 무엇을 전달할까요? wait이 실패하는 것은 어떤 경우일까요?

status는 자식 프로세스의 상태를 가져오기 위해서 사용합니다. 다양한 매크로를 이용해 프로세스의 상태에 대한 정보를 알 수 있습니다. 예를 들어, WIFEXITED(status)같은 경우 child process가 정상 종료되었다면 status가 0이 아닐 것입니다. wait이 실패하는 경우에는 parameter로 넘겨준 pid의 프로세스 또는 프로세스 그룹이 존재하지 않거나 자식 프로세스가 아닐 때 발생합니다.


(이러한 모든 시스템 콜들은 호출하는 프로세스의 child의 상태 변화를 기다리고  상태가 변한 child의 정보를 얻기 위해 사용됩니다. 상태 변화는 다음과 같은 것들입니다: child가 종료; child가 signal에 의해 정지; child가 signal에 의해 시작. child가 종료된 경우, wait은 시스템이 child에게 할당되었던 자원을 release할수 있도록 해줍니다. 약 wait이 수행되지 않으면, 종료된 child들은 zombie 상태로 남아있게 됩니다.

만약 status가 NULL이 아니라면, wait과 waitpid가 status information이 가리키는 곳에 int로 저장합니다. 이 정수로 exitmacro들을 통해 상태를 알 수 있습니다.)



5.SIGKILL, SIGSTOP, SIGCONT, SIGINT의 차이점은 무엇일까요? 기본 정의된 동작은 무엇일까요? signal handler에 사용할 수 있는건 무엇인가요?


SIGKILL과 SIGINT는 모두 프로세스를 종료시킵니다. SIGINT는 주로 정상적으로 종료했을 때 사용되어집니다. SIGSTOP은 프로세스를 정지시킵니다. SIGCONT는 정지된 프로세스를 다시 시작시킵니다.

SIGKILL과 SIGSTOP은 signal handler에서 사용할 수 없습니다. SIGINT는 signal handler에서 사용이 가능합니다.



6. CTRL-C를 누르면 어떤 signal이 보내질까요?

SIGINT가 보내집니다.



7. 터미널이 PID = 1337에 고정되어 있고 방금 응답이 없어졌습니다. 이 때 SIGQUIT을 보낼 수 있는 terminal command와 C 코드는 무엇일까요?


kill(child,SIGQUIT);




8.한 프로세스가 일반적인 방법으로 다른 프로세스 메모리를 변경할 수 있을까요? 


가능합니다 버퍼가 작아서????????



9. 힙, 스택, 데이터, 텍스트 세그먼트는 어디에 있습니까? 어떤 세그멘트가 쓸 수 있는 곳일까요? 유효하지 않은 메모리 주소는 무엇일까요?


주소의 아래번지부터, 텍스트, 데이터, 스택, 힙이 존재합니다 텍스트 세그먼트를 제외한 나머지 세그먼트에는 쓰는 것이 가능합니다. text segment 아래, stack 윗 부분은 유효하지 않은 메모리 주소입니다.


10. C에서 frok bomb을 작성해보세요(실행하지 말것!)


while(1)

fork();


11. orphan이 무엇입니까? zombie는 왜 생길까요? 어떻게 하면 좋은 부모가 될까요??

orphan은 child process가 종료되기 전에 parent process가 먼저 종료되는 경우입니다. 이러한 경우 orphan이 되어 init process에게 입양 된 후 wait되어 process table에서 사라집니다. zombie process는 반대로 parent process가 wait을 하지 않아 child process가 종료되었음에도 process table을 차지하고 있는 경우입니다. 좋은 parent process가 되려면 wait을 해주어야 합니다.


12 parent process에게 SIGSTOP을 보내는 프로그램을 만들어 봅시다.


#include <unistd.h>

#include <stdio.h>

int main()

{

signal(SIGCHLD, stopParent());

pid_t child;

int * status;

child = fork();

if(child == -1)

breakl

else if(child == 0)

{

kill(getppid(), SIGSTOP);

return 0;

}

else

{

printf("parent\n");

wait(status);

return 0;

}

}




13. exec fork를 기다리는 함수를 만들어봅시다. 이 때 wait macro를 이용해 정상적으로 종료되었다면 return value를 출력하고, 비정상적인 종료라면 프로세스를 종료시킨 signal번호를 출력합니다.


#include <stdio.h>

#include <unistd.h>

#include <signal.h>

#include <sys/wait.h>

int main()

{

int status;

pid_t child = fork();

if(child == -1)

return 1;

if(child == 0)

{


execlp("echo", "echo", "hello", NULL);

}

else if(child > 0)

{

pid_t pid = waitpid(child, &status, 0);

if(WEXITSTATUS(status) == 0)

printf("status : %d\n", WEXITSTATUS(status));

else

printf("abnormal exit: %d\n", WTERMSIG(status));

}


}



'Angrave System Programming > Processes' 카테고리의 다른 글

Process Control : Signals  (0) 2019.01.11
Process Control : Wait macros  (0) 2019.01.11
Forking: Fork, Exec, Wait(2)  (0) 2019.01.11
Forking: Fork, Exec, Wait(1)  (0) 2019.01.11
Forking Introduction  (0) 2019.01.10
Posted by 몰랑&봉봉
,