,这是一个很长的问题,请耐心等待。我要做的是同时运行两个进程。每个进程将读取一个文件foo.txt
,找到最后一个数字,将其递增并添加回文件中。由于会有明显的比赛条件,我正在尝试实施Peterson的解决方案来避免它
这一切都是在Minix3环境中完成的。我已经定义了一个变量shared_val
,它是为系统上运行的每个进程初始化的。以及两个系统调用,get_sv
返回shared_val的值,set_sv
将用户值设置为shared_val。
我使用每个流程的shared_val值来实现Peterson的解决方案。我还将两个进程ID写入一个.txt文件config.txt
。
代码编译良好,但不能写入foo.txt
。有人能解释为什么会发生这种事吗?
#include <stdio.h>
#include <stdlib.h>
#include "sys/types.h"
#include <unistd.h>
#include <strings.h>
#define MAX 10000
int main(int argc, char *argv[])
{
int yourPID, status = 0, tempid, temp, temp1, i = 0, times;
int ch[10];
int a, b, tempo, x, y;
FILE *fp, *fp1;
times = atoi((argv[1]));
ch[i++] = getpid();
fp = fopen(argv[3], "a");
while(i>=0)
{
fprintf(fp, "%d", ch[1]);
i--;
}
fclose(fp);
if(yourPID == ch[0])
{
set_sv(0, &status);
}
if(yourPID == ch[1])
{
set_sv(0, &status);
}
do
{
yourPID = getpid();
if(yourPID == ch[0])
{
temp = get_sv(ch[0], &status);
}
if(yourPID == ch[1])
{
temp1 = get_sv(ch[1], &status);
}
sleep(1);
a = ~temp & ~temp1;
b = temp & temp1;
sleep(1);
if(yourPID == ch[0] && ((~a & ~b) == 0))
{
char ch1[MAX], len, pos;
fp1 = fopen(argv[2], "r");
while(!feof(fp))
{
fscanf(fp1,"%s", ch1);
}
fclose(fp1);
len = strlen(ch1);
pos = len - 1;
tempo = ch1[pos] + 1;
fp1 = fopen(argv[2], "a");
fprintf(fp1, "%c", tempo);
fclose(fp1);
tempo = get_sv(yourPID, &status);
if(tempo == 0)
{
tempo = 1;
set_sv(tempo, &status);
}
if(tempo == 1)
{
tempo = 0;
set_sv(tempo, &status);
}
sleep(1);
continue;
}
if(yourPID == ch[1] && ((~a & ~b) == 1))
{
char ch1[MAX], len, pos;
fp1 = fopen(argv[2], "r");
while(!feof(fp1))
{
fscanf(fp1, "%s", ch1);
}
fclose(fp1);
len = strlen(ch1);
pos = len - 1;
tempo = ch[pos] + 1;
fp1 = fopen(argv[2], "a");
fprintf(fp1, "%c", tempo);
fclose(fp1);
tempo = get_sv(yourPID, &status);
if(tempo == 1)
{
tempo = 0;
set_sv(tempo, &Status);
}
else
{
tempo = 1;
set_sv(tempo, &status);
}
sleep(1);
continue;
}
times = times - 1;
}while(times > 0);
return 0;
}
我在整个代码中添加了sleep(1)
语句,以便让其他进程有时间跟上。
我为此使用的bash命令是:./safe_increment 5 foo.txt config.txt & ./safe_increment 5 foo.txt config.txt
其中,5是每个进程写入文件的次数。
这甚至不应该编译——声明yourPID的第一行在状态初始化器之后有一个错误,我没有看到I的声明。这可能是一个剪切错误,但接下来还有很多事情不清楚你想做什么,或者根本不起作用。
一般来说,仅仅是sleep()不会为您提供可靠的进程间同步。