fork関数の挙動
C言語では
fork
関数を使って fork(2)
システムコールを呼び出すことができます。#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t pid = fork();
if (pid == 0) {
printf("Hello from child process\n");
} else {
printf("Hello from parent process\n");
}
}
❰yuchi❙~/Desktop/sysprog❱✔≻ gcc fork.c -o fork
❰yuchi❙~/Desktop/sysprog❱✔≻ ./fork
Hello from parent process
Hello from child process
こんな感じで親プロセスと子プロセスがそれぞれメッセージを出力してくれます。
ところで、
fork
したとき、子プロセスには親プロセスのメモリ空間がまんまコピーされます。#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t pid = fork();
int x = 123;
if (pid == 0) {
printf("Hello from child process! btw x = %d\n", x);
} else {
printf("Hello from parent process! btw x = %d\n", x);
}
}
❰yuchi❙~/Desktop/sysprog❱✘≻ gcc fork.c -o fork
❰yuchi❙~/Desktop/sysprog❱✔≻ ./fork
Hello from parent process! btw x = 123
Hello from child process! btw x = 123
では次のコードはどうなるでしょうか
#include <stdio.h>
#include <unistd.h>
int main(void) {
for (size_t i = 0; i < 3; i++)
{
printf("hoge");
}
pid_t pid = fork();
if (pid == 0) {
printf("Hello from child %d!\n", getpid());
} else {
printf("Hello from parent %d!\n", getpid());
}
}
これの出力はこうなります。
❰yuchi❙~/Desktop/sysprog❱✔≻ gcc fork.c -o fork
❰yuchi❙~/Desktop/sysprog❱✔≻ ./fork
hogehogehogeHello from parent 21679!
hogehogehogeHello from child 21680!
hogehogehoge
が二重に出力されました。これは
fork
したとき、親プロセスのバッファもコピーされるためです。fork
する前にはちゃんと fflush
しておきましょう。感想
システムプログラミングの講義で先生が話していて試したら確かにそうなってへ〜〜ってなりました