C 如何同步文件读取以读取同一文件

C 如何同步文件读取以读取同一文件,c,io,synchronization,C,Io,Synchronization,问题 大家好,我正在尝试让两个进程读取同一个文件。这很容易,但我需要两个进程以这样的方式读取文件,即当一个进程读取并更改指针位置时,它会更改另一个进程上的指针,直到EOF。我如何做到这一点 我当前的实现将读取每个进程的文件,但它将从两个进程的a-z读取 我要你的意见 acdef 然后给出 程序1改为:a 程序2改为:b 程序1改为:c 程序2改为:d 程序1改为:e 程序2改为:f 找到EOF,正在退出程序 背景 我正在为本操作系统课程构建的项目的背景。该项目将执行一个名为program1的程

问题

大家好,我正在尝试让两个进程读取同一个文件。这很容易,但我需要两个进程以这样的方式读取文件,即当一个进程读取并更改指针位置时,它会更改另一个进程上的指针,直到EOF。我如何做到这一点

我当前的实现将读取每个进程的文件,但它将从两个进程的a-z读取

我要你的意见

acdef

然后给出

程序1改为:a
程序2改为:b
程序1改为:c
程序2改为:d
程序1改为:e
程序2改为:f
找到EOF,正在退出程序

背景

我正在为本操作系统课程构建的项目的背景。该项目将执行一个名为program1的程序,然后该程序将创建9个管道、一个信号量、一个共享内存,用于计算已读取的字符数,然后还接收文件名的命令行参数。第一个程序还将在创建其他所有内容后生成9个子程序,并向它们传递所有以前的信息,一条管道从program1传递到特定子程序、信号量、共享内存位置和文件名

每个孩子都可以同步访问一个文件,即共享内存。然后,每个孩子将随机读取1-10个字符,然后将共享内存增加该数量。然后,子级将发送当前具有访问权限的程序的名称以及读写它们到管道中的字符。如果到达行尾,它们还将在写入管道的同一字符串中写入读取字符的总数。当特定子级执行此操作时,它会将执行传递给program1以执行

当程序1通过信号量获得执行权限时,它将读取通过所有非阻塞管道发送的字符串。然后将该字符串写入输出文件,然后释放信号量供任何子级再次使用,直到达到eof。

程序尝试

这是一个示例程序,用于说明出现了什么问题。我尝试将文件名传递给子级,然后父级和子级都尝试同步读取文件

母公司


在两个进程之间创建一个共享内存,并将文件指针放入其中


要做到这一点,只需将文件指针放在共享内存上,即您需要在shm中分配一个大小为sizeof(file*)的内存,它只是一个整数值;但是,当两个进程想要访问shm并发时,请注意shm并发。你可以用信号量来实现这一点。

在两个进程之间创建一个共享内存,并将文件指针放入其中。要做到这一点,我需要将mmap的大小设置为sizeof(文件)?这个每次我读取字符时,它都会更新文件指针的位置,而不是我想象的那样。不!只需将文件指针放在共享内存上,即您需要在shm中分配一个大小为sizeof(file*)的内存,它只是一个整数值;但是,当两个进程想要访问shm并发时,请注意shm并发。你可以用信号量做到这一点,听起来不错。似乎是解决我问题的一个很简单的办法。谢谢既然我已经知道如何使用共享MemoryAy,那么我该如何将文件指针分配给内存地址呢?这对我来说有点奇怪。@Fel你应该使用
shm
api,比如
shm\u-open
mmap
;看见
#define  key (3000)

int main() 
{ 


    FILE *fPTR;
    int c, semID;

    struct sembuf operations[1];


    pid_t PID1;

    int argCount = 2;
    int size = 20;

    union semun {


        int value;
        struct semid_ds *buffer;
        ushort *array;

    } arg;


    char **args = (char **) malloc( (argCount) * (sizeof (char *) ));
    args[0] =     (char *)  malloc( (size)     * (sizeof (char  ) ));
    args[1] =     (char *)"inputTest.txt";



    semID = semget(key, 3, 0666 | IPC_CREAT);


    fPTR = fopen("inputTest.txt", "r");


    if(semctl(semID, 0, SETVAL, arg) < 0){


        fprintf(stderr, "was unable to set value of sempahore 0" );
        exit(0);
    }



    PID1 = fork();



    if(PID1 == 0){

        sprintf(args[0], "%d", semID);


        if(execvp("./TestReadingChild", args) == -1){

            printf("failed to execute TestReadingChild\n");
            exit(0);
        }

    }

    if(PID1 >= 0){


        while(1){


            if(semctl(semID, 0, GETVAL, arg) == 0){

                if((c = fgetc(fPTR)) != EOF){

                    printf("Program1 read: %c\n", (char) c);
                }else{

                    fclose(fPTR);
                    break;
                }





                operations[0].sem_num = 0;
                operations[0].sem_op = 1;
                operations[0].sem_flg = 0;

                semop(semID, operations, 1);


            }


        }
    }


}
#define  key (3000)

int main(int argc, char *argv[]) 
{ 

    char *fileName = argv[1];
    FILE *fPTR;
    int semID = atoi(argv[0]);
    int c;

    struct sembuf operations[1];

    pid_t PID1;

    int argCount = 2;
    int size = 20;

    union semun {


        int value;
        struct semid_ds *buffer;
        ushort *array;

    } arg;

    char **args = (char **) malloc( (argCount) * (sizeof (char *) ));
    args[0] =     (char *)  malloc( (size)     * (sizeof (char  ) ));
    args[1] =     (char *)  fileName;


    semID = semget(key, 3, 0666 | IPC_CREAT);
    fPTR = fopen(fileName, "r");


    while(1){


        if(semctl(semID, 0, GETVAL, arg) == 1){

            if((c = fgetc(fPTR)) != EOF){

                printf("Program2 read: %c\n", (char) c);
            }else{
                fclose(fPTR);
                break;
            }





            operations[0].sem_num = 0;
            operations[0].sem_op = -1;
            operations[0].sem_flg = 0;

            semop(semID, operations, 1);
        }


    }
}