본문 바로가기
깨알 c언어

깨알 c언어 특강 01 ~ 03

by moca7 2024. 3. 11.

01. printf 출력순서

02. ++가 연속으로 있을 때 처리

03. fork

 

 

 

01. printf 출력순서

 

ㅁ 개떡같은 문제. 이런 문제 나오면 다 틀림.

- 너무 깊게 안봐도 됨. 컴파일러마다 다르다. 

- (9개월 전) 이런 문제는 아마 출제되지 않을 거에요.

 

- 5, 7, 7, 9              

틀린 답이다. 왜냐, printf는 뒤에서부터 연산을 시작해서. 

- 4번째 ++i

그런데 연산만 먼저하고 출력은 안함. 이 시점에서 i는 6.

맨 마지막 ++i가 6으로 확정되지 않음. 최종적으로 i값을 참조.

- 3번째 i++

후위 증감식은 지금 현재 i값을 참조함.

6값 출력. 이 시점에서 i는 7

- 2번째 ++i

연산만 먼저하고 출력은 안함. 이 시점에서 i는 8.

- 1번째 i++

8값 출력. 이 시점에서 i는 9

 

- 그리고 print라는 연산을 만남. 

print라는 연산을 만났을 때 지금 현재 i값을 참조. 

그래서 두번째 출력값과 네번째 출력값이 다 9.

출력결과. 8, 9, 6, 9

 

- ++가 i 뒤에 있어야 그 때 i 값을 참조함. 그냥 i가 있으면 그것도 ++i처럼 참조 안하다가 연산 만나고 참조함. 

 

ㅁ 2번째 문제

 

- 네번째 --i

출력은 안 함. 이 시점에서 i는 4

- 세번째 i--

4 출력. 이 시점에서 i는 3

- 두번째 i--

3 출력. 이 시점에서 i는 2

- 첫번째 --i

출력은 안 함. 이 시점에서 i는 1 

 

- print 연산 만남. 

출력결과. 1 3 4 1

 

 

02. ++가 연속으로 있을 때 처리

 

ㅁ 문제

 

- z는 5 + 6 + 7 = 18

i는 8이 됨.

- 답 8, 18 

이건 문제없음.

 

ㅁ 문제

 

- 이게 문제가 됨.

- z는 6 + 7 + 8 = 21 이 아님.

- 아마 이런 문제가 나오진 않을 것.

- 첫번째 ++i에서 i는 6이 되지만 출력은 안 됨. 연산이 없어서. 

두번째 ++i에서 i는 먼저 7이 됨. 그리고 연산을 만남. 그래서 7 + 7 출력.

세번째 ++i에서 i는 8이 됨. 연산을 만났으니 출력 됨.

- 답. 8 22

 

ㅁ 문제

 

- 첫번째 ++i에서 i는 6이 되지만 출력은 안함.

두번째 ++i 6바로 출력하고 i는 7이 됨. 연산을 만났으니 첫번째 i 출력. 6+7

세번째 ++i에서 i는 8이 되고 연산을 만났으니 출력. 6+7+8

- 답 8, 21

- 증감연산자가 앞에 붙었을 때는 연산 시점에 값을 가져온다. 

 

 

 

 

03. fork

 

ㅁ fork

- fork는 순서만 정확히 알면 쉽게 풀 수 있다. 

- 리눅스에서 쓰는건데 자식 프로세스를 생성할 때 쓰는 거. 

메인 프로세스에 포크를 찔러서 자식(피)이 나오게. 

- 리눅스 명령 중에 fork가 있고 c언어에서도 그 fork를 쓸 수 있다.

 

- fork()함수는 함수를 호출한 프로세스를 복사하는 기능을 한다. 이 때 부모 프로세스와 자식 프로세스가 나뉘어 실행되는데, 원래 진행되던 프로세스는 부모 프로센스, 복사된 프로세스를 자식 프로세스라 한다.

- fork()함수는 프로세스 id, 즉 pid를 반환하는데 이때 부모 프로세스에서는 자식 pid가 반환되고 자식 프로세스에서는 0이 반환된다. 만약 fork() 함수 실행이 실패하면 -1을 반환한다. 

 

ㅁ 문제

 

- pid_t pid;

pid = fork();

 

프로세스를 생성할 수 있는 라이브러리가 있음.

그 라이브러리를 쓰면 fork라는 명령을 수행할 수 있음.

 

- fork 수행. 부모 프로세스가 있고 자식 프로세스를 생성함.

pid에 리턴값이 들어가는데, 실패하면 -1, 자식프로세스면 0, 부모프로세스면 0보다 큰 걸(자식 pid)받음. 

- fork를 수행할 때 어떤 순서로 수행이 되느냐.

부모프로세스가 먼저 수행하고 자식프로세스를 수행함.

 

- wait이 없다고 가정하면,

문제에서 성공하였다고 가정하였으니 0보다 큰 값이 pid로 넘어감.

if, else if 다 무시. else의 for문 수행. 

출력. a = 6 

그 다음 자식프로세스 수행. 

else if 수행.   

출력. b= 120

출력결과. "a=6b=120, "

 

- 문제에선 wait이 있음.

문제에서 성공하였다고 가정하였으니 0보다 큰 값이 pid로 넘어감.

if, else if 다 무시. else의 for문 수행. 

그런데 wait이 있음. wait은 자식 프로세스가 수행할때까지 부모 프로세스가 기다리라는 것.

 

그럼 자식프로세스가 돌기 시작하고 자식프로세스가 다 돌면 다시 부모 프로세스가 돎.

else의 for 반복문은 안한 채로 자식 프로세스가 수행. 

pid=0이니 출력. b= 120

 

그 다음 부모 프로세스의 for문 수행.  출력. a = 6 

출력결과는 b=120, a=6

 

- 실패 시에는 프로세스가 하나 더 생기지 않은거니까 실패조건으로 가고 끝남.

pid가 음수인 프로세스 한 번으로 끝. 

두 개가 실행되는 건 자식이 생성됐기 때문에 두 번 처리가 되는 것.

- if는 3개 중에 하나만 수행 됨. fork는 두 번 수행됨. 부모돌고 자식돌고.

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.56 ~ 60  (0) 2024.03.11
깨알 c언어 ch.51 ~ 55  (0) 2024.03.11
깨알 c언어 ch.46 ~ 50  (0) 2024.03.10
깨알 c언어 ch.41 ~ 45  (0) 2024.03.10
깨알 c언어 ch.36 ~ 40  (0) 2024.03.09