#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
int main(int argc, char* argv[])
{
  int running = 1;
  int shid;
  int semid;
  int value;
  int read_num;
  FILE *stream;
  char* sharem=NULL;
  struct sembuf sem_b;
  sem_b.sem_num = 0;
  sem_b.sem_flg = SEM_UNDO;
                                                          
  if((semid = semget((key_t)123456,1,0666|IPC_CREAT))==-1)
    {
      perror("semget");
      exit(EXIT_FAILURE);
    }
  if(semctl(semid,0,SETVAL,0)==-1)
    {
      printf("sem init error");
      if(semctl(semid,0,IPC_RMID,0)!=0)
    {
      perror("semctl");
      exit(EXIT_FAILURE);
    }
      exit(EXIT_FAILURE);
    }
  shid = shmget((key_t)654321,(size_t)30,0600|IPC_CREAT);
  if(shid == -1)
    {
      perror("shmget");
      exit(EXIT_FAILURE);
    }
  sharem = shmat(shid,NULL,0);
  if(sharem==NULL)
    {
      perror("shmat");
      exit(EXIT_FAILURE);
    }
   stream = fopen("data.in","r");
  while(running)
    {
      // printf("write data operate\n");
      // while((semctl(semid,0,GETVAL))==1);
      if((value=semctl(semid,0,GETVAL))==0)
    {
                                                              
    // if((read_num = fread(sharem,20,1,stream))==0)
    //          running--;
          if(fscanf(stream,"%s",sharem)!=EOF)
        {
               printf("%s\n",sharem);
           sem_b.sem_op = 1;
           if(semop(semid,&sem_b,1)==-1)
             {
                printf("error\n");
                exit(EXIT_FAILURE);
                 }
        }
          else   break;
    }
    }
  printf("send completed\n");
  fclose(stream);
  shmdt(sharem);
  return 0;
}

以上是sender进程。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
int main(int argc, char *argv[])
{
  int running = 1;
  char *shm_p = NULL;
  int shmid;
  int value;
  int semid;
  FILE *stream;
                                                   
  struct sembuf sem_b;
  sem_b.sem_num=0;
  sem_b.sem_flg=SEM_UNDO;
                                                   
  semid=semget((key_t)123456,1,0666|IPC_CREAT);
  shmid = shmget((key_t)654321,(size_t)30,0600|IPC_CREAT);
  shm_p = shmat(shmid,NULL,0);
  printf("read data operate\n");
  //stream = fopen("data.out","w+");
  char buffer[50];
  while(running)
    {
      while((value=semctl(semid,0,GETVAL))==1)
    {
      stream = fopen("data.out","a+");
      sem_b.sem_op = -1;
      if(semop(semid,&sem_b,1)==-1)
        {
          printf("error\n");
          exit(EXIT_FAILURE);
        }
      strcpy(buffer,shm_p);
      printf("%s\n",buffer);
      //fwrite(shm_p,20,1,stream);
      fprintf(stream,"%s\n",buffer);
      fclose(stream);
    }
      if(strcmp(shm_p,"end")==0)
    running--;
    }
  shmdt(shm_p);
  if(shmctl(shmid,IPC_RMID,0)!=0)
    {
      perror("shmctl");
      exit(EXIT_FAILURE);
    }
  if(semctl(semid,0,IPC_RMID,0)!=0)
    {
      perror("semctl");
      exit(EXIT_FAILURE);
    }
  return 0;
}

以上是receiver进程。

sender:从data.in中读取数据写入到共享内存。

receiver:从共享内存读数据,写入到data.out。

以end作为结束符。

用信号量作为同步机制。