プログラムがあります (Ubuntu 12.04 LTS、シングルコア プロセッサ):
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
int main(){
mode_t mode = S_IRUSR | S_IWUSR;
int i = 0, fd, pid;
unsigned char pi1 = 0x33, pi2 = 0x34;
if((fd = open("res", O_WRONLY | O_CREAT | O_TRUNC, mode)) < 0){
perror("open error");
exit(1);
}
if((pid = fork()) < 0){
perror("fork error");
exit(1);
}
if(pid == 0) {
if(write(fd, &pi2, 1) != 1){
perror("write error");
exit(1);
}
}else{
if(write(fd, &pi1, 1) != 1){
perror("write error");
exit(1);
}
}
close(fd);
return 0;
}
アイデアは、ファイルを書き込み用に開き、次に fork することです。両方のプロセスのレコード合計が存在する位置。奇妙なことは、プログラムを実行すると、ファイル「res」への出力が一定ではないことです。私は激怒し、次に 34、次に 4、そして 3 になりました。(結局のところ、ポジションが共有されている場合、結論は 34 または 43 のいずれかでなければなりません。)
私の疑いでは、彼が書き込む位置を見つけたときに、書き込み関数でプロセスが中断されます。