有一个程序(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;
}
这个想法是打开文件进行写入,然后再分叉。两个过程的总和记录的位置。奇怪的是,如果你运行这个程序,它输出到一个文件的“res”不是恒定的:我激怒了然后是34 然后是4 然后是3。问题是为什么会有这样的结论?(毕竟,如果位置是共享的,那么结论必须是 34 或 43。)。
在我的怀疑中,当他找到一个可以写的位置时,这个过程在函数 write 中被打断了。