어셈블된 코드
어셈블된 코드
sample.c :c코드 sample.a : 어셈블드코드
각 cpu에 맞는 어셈블드코드가 어떻게 생성되었는지 확인하려면? (같은코드여도 다 다르다)
: gcc -S -o sample.a sample.c
sample.a의 생성 확인
: ls
자세히보기?
: more sample.a
static은 local변수이기도 하지만(.local) int 처럼 계속 가지고 있을것이다(.comm)
프로그램 실행의 원리
1. 프롬프트를 내고 명령어를 입력 받는다.
2. 자식 프로세스를 생성한다. (fork())
3. 자식 프로세스에게 명령어를 실행시킨다.
자식프로세스의 역할이 명령어 실행시키기!
-> fork() 후 exec() 시스템 호출 사용
-exec() 호출이 성공하면 리턴할 곳이 없어진다.
-성공한 exec()호출은 절대 리턴하지 않는다.
->쉽게 말해, exec() 호출시 자식 프로세스는 사라지고 exec만 남게 된다
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/*자식 프로세스를 생성하여 echo명령어를 실행한다.*/
int main()
{
printf("부모 프로세스 시작\n");
if(fork()==0){
execl("/bin/echo","echo","hello",NULL); //자식프로세스는 사라지고 exec으로 대체, echo는 화면에띄우는명령어,hello는 띄울문자 //exec + l ->list 형태로 할거야
fprintf(stderr,"첫번째 실패");
exit(1);
}
printf("부모 프로세스 끝\n");
}
실행 결과
부모 프로세스 시작
부모 프로세스 끝
hello
자식프로세스가 hello라는 명령어를 process로 실행한 후 끝난 형태
프로그램을 실행시키면
bash 가 child 생성하고
child가 exec 호출하고
exec이 bin ls 따위 가 아니라
내가 만든 프로그램을 exec 이용해서 실행한다 - 시작과 끝
헷갈릴 때
getpid : id출력
pid : 리턴값
평소 getpid는 부모의 id만 출력하고
자식의 id는
1. 따로 wait써서 child에 저장하거나
2.if pid==0 이라는 전제 후 getpid 해줄 때만 나온다.