プロセスあたりで躓く…(テスト一週間前
#include <unistd.h> #include <sys/types.h> #include <errno.h> #include <stdio.h> #include <sys/wait.h> #include <stdlib.h> int main(void) { int a = 0; pid_t pid; if((pid = fork()) == 0){ puts("Child PID"); a++; printf("a = %d\n&a = %p\n",a,&a); printf("getpid():%d\n",getpid()); _exit(0); }else if(pid > 0){ a=10; puts("Parent PID"); printf("a = %d\n&a = %p\n",a,&a); printf("getpid():%d\n\n",getpid()); _exit(0); }else{ _exit(0); } return(0); }
Parent PID a = 10 &a = 0xbfe0d65c getpid():27634 Child PID a = 1 &a = 0xbfe0d65c getpid():27635
なんのへんてつもないように見えるけど、
親プロセスが、&a = 0xbfe0d65cでさきに実行してるなら、
&aは10が代入されてます。
それから、子プロセスが1を出力しているからローカル変数だけど、
違うアドレス(よは0xbfe0d65cでないアドレス)が使われていると思ってました。
しかし、子プロセスの&a = 0xbfe0d65cという全く同じアドレスの変数をインクリメントしたら
ローカル変数a=0 + 1した形になってる。
(もし、同じアドレスでかつさきにaが代入されているならa=10 + 1だと思う…)
なんでなんでしょうか…。
gdb使って、検証しようと思ったけど、
普通に実行すると、子プロセスでのブレイクポイント無視されるし、
set follow-fork-modeにすると
親プロセスでのブレイクポイント無視されるし、
端的に言えば、慣れてないだけなんだけど嫌になったので、、
ぽてちせんせいとかじりずせんせいとかに聞こうっと、、