gcc 소스인데요~ 아래 파일을 돌리면어떻게 돼나요`?이론적으로
글쓴이: newman1590 / 작성시간: 수, 2004/04/07 - 11:31오후
#include<stdio.h>
void main(int argc, char *argv[])/ 그리고 이부분도 좀 알려주세요!!
{
int pid
pid=fork();
if(pid<0)
{
fprintf(stderr,"fork failed");
exit(-1);
}
else if (pid==0)
{
execlp("/bin/ls","ls",NULL);
}
else
{
wait(); // 이부분이 어떻게되는지요~
printf("Child Complete");
exit(0);
}
}
Forums:
man forkman wait질문하기 전에 시스템 프로그래밍
man fork
man wait
질문하기 전에 시스템 프로그래밍 책 한 section만 읽어보시죠? :(
[code:1]#include <stdio.h>vo
일단 소스를 올리실때는 BBCode를 이용해주십시요.
물어보신 부분에 대한 답변을 먼저 드리겠습니다.
main (int argc, char* argv[]) 부분은 시스템의 프로그램 실행과 관련이 있습니다.
보통 프로그램을 실행시키면(프로그램 이름이 test이라면...)
# test
형태로 실행을 시킵니다. 위에 인수는 이때 사용합니다.
다음 예에서
# test 1 2 argument 3
이렇게 되었을경우 int argc로는 인수의 갯수인 4가 들어옵니다.
또한 *argv []로는
argv [0]에는 'test', argv [1]에는 '1', argv [2]에는 '2', argv [3]에는 'argument',
argv [4]에는 '3'이라는 값이 들어갑니다.
fork()가 실패하면 0보다 작은 값이 리턴됩니다.
fork()가 성공하면 자기자신(root)에는 child의 PID값이 리턴되고 fork()에 의해서 생성되는
child는 0의 값이 리턴됩니다.
마지막으로 현재 물어보시는 부분은 기본적인 UNIX C언어책을 보면 자세하게
설명되어있습니다.
책을 먼저보실것을 권해드립니다. 책을 읽어보지 않고 이런식으로 질문을 해서는
좀체로 공부에 도움이 되지 않습니다.
------------------------------
좋은 하루 되세요.
-0-
pid==0인 child process가 종료가 되겠죠 완료를 하면..
그때까지 기다립니다...
위에 부분은, 명령줄인수입니다.
Beginning Linux Programming se- 정보문화사
한번 보시면 도움이 되실겁니다.
VENI VIDI VICI
exit(-1)이 아니라 exit(1)로 해야 맞지 않을까요??
exit(-1)이 아니라 exit(1)로 해야 맞지 않을까요??
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
이 소스 한빛 미디어에서 나온 [code:1]secue coding
이 소스 한빛 미디어에서 나온
secue coding 핵심 원리
라는 책에서 본 예제랑 비슷 하던데 컴파일 오류는 없는데 실행은 안되고. 그리고 뜻도 이해도 잘 안되었던 건뎁...그책에서는 외부 프로그램 실행 함수로
execle("/bin/ls", "ls", "-al", NULL);
실행을 하였더군요...
이 함수에 대해서 설명 좀 부탁 드립니다. 맨페이지도 읽어 봤는데 저의 아둔한 머리로는 이해가 잘 안되더군요. system()함수는 쓰지 말라면서 그러던데 그건 또 왜 그런지...
---------------------------------
나는 오늘도 달립니다.
[quote="codebank"][code:1]......
이것을 아래처럼 해야하고요.
wait시스템 호출을 사용한 이유는 좀비(zombie process)를 방지하기 위함입니다.
좀비는 언제 생길까? 부모 프로세스가 자식프로세스의 종료를 알고도 처리안해주면 발생.
어떻게 아냐고요? 자식이 죽으면 커널이 부모에게 시그널(sigchild)을 줍니다.
이 때 부모가 이에 대한 처리를 해주지 않으면 좀비가 됩니다.
어떻게 방지할까? 시그널에 대한 처리를 해주면 됩니다. wait시리즈 또는 아예 해당 시그널을 매스킹해놓음
유닉스(리눅스는) 왜 이러한 경우 좀비로 남길까? 프로그래머가 프로세스를 만들었으면,
당연히 그 프로그램의 종료(정상? 비정상?)에 대한 처리를 해야 한다는 명제지요.
부모가 먼저 죽으면? 유닉스는 모든 프로세스가 부모 자식의 관계를 가지게 되어
있습니다. 또한, 인간세계와는 달리 확실한 입양원칙이 있습니다.
부모가 없는 모든 프로세스는 1번 프로세스(init)가 입양한다. 즉, 부모가 1번
프로세스가 되게 됩니다. 이후 자식이 죽으면, 1번 프로세스가 그 시그널에 대한
처리를 해줍니다. 1번이 죽으면? 그럼 유닉스가 죽은겁니다. 종말이지요.
게시판 게시물에서 좀비에 대해 찾아보세요. 검색으로.
글구 관리자님의 답변처럼 책을 잘 ~ 보심을 권합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기