0

我正在尝试从进程之间的共享文件中读取和写入。该文件有 6 行要读取,然后应该由一个进程插入新行。更准确地说,我希望我的阅读过程同时完成,但写作过程一次一个过程。出于这个原因,我使用单个信号量来同步我的进程。首先,我要创建 7 个孩子。然后,使用 for 循环我正在调用一个函数,该函数从文件中读取一行然后打印它。如果最后一个读取过程完成读取,它会执行一个 UP 操作,该操作被最后一个写入文件最后一行的子进程捕获。

这是我的文件:

你好!这是进程之间的共享文件!

你好!这是进程之间的共享文件!

你好!这是进程之间的共享文件!

你好!这是进程之间的共享文件!

你好!这是进程之间的共享文件!

你好!这是进程之间的共享文件!

这是我的代码:

#include <stdio.h>          /* printf()                 */
#include <stdlib.h>         /* exit(), malloc(), free() */
#include <sys/types.h>      /* key_t, sem_t, pid_t      */
#include <sys/shm.h>        /* shmat(), IPC_RMID        */
#include <errno.h>          /* errno, ECHILD            */
#include <semaphore.h>      /* sem_open(), sem_destroy(), sem_wait().. */
#include <fcntl.h>          /* O_CREAT, O_EXEC          */
#include <sys/mman.h>
#include <unistd.h>
#include <sys/wait.h>

sem_t wrt;

void read_print(FILE *file)
{
    char c[1000];

    fscanf(file, "%[^\n]", c); //reading a single line from the file
    printf("%s\n", c); //and printing it.
}

int main()
{
    FILE *fp;
    int i, counter = 0;
    pid_t pid[7];


    fp = fopen("shared_file.txt", "r+");
    sem_init(&wrt, 1, 1); //initialiing the semaphore to be shared between$


    if(fp == NULL)
    {
            printf("Error opening file!");
     exit(1);
    }

    /* creating the child processes  */
    for(i = 0; i <7; i++)
    {
            pid[i] = fork();

            if(pid[i] == 0)
                    break;
    }

    for(i = 0; i<6; i++)
            if(pid[i] == 0) //if the processes is a child process
            {
                    read_print(fp); //call the function
                    counter++; //increment the process counter by 1

                    if(counter == 6) //if we are at the final process
                            sem_post(&wrt); //UP operation

                    exit(0); //and then exits
            }
     if(pid[6] == 0) //if the final process is a child
     {
            sem_wait(&wrt); //DOWN operation
            fprintf(fp, "...and this is the final line."); //writes a new $
            exit(0);
     }


     fclose(fp); //closes the file.

     return 0;
}
4

0 回答 0