c-不写入文件的进程



,这是一个很长的问题,请耐心等待。我要做的是同时运行两个进程。每个进程将读取一个文件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()不会为您提供可靠的进程间同步。

相关内容

  • 没有找到相关文章

最新更新