我正在尝试从进程之间的共享文件中读取和写入。该文件有 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;
}