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 |