内存映射文件,用作c中的记录程序数据

时间:2017-12-09 21:57:47

标签: c linux file-descriptor memory-mapped-files lseek

我尝试使用内存映射文件记录程序的活动。文件创建得很好,我也不能写它,但是我遇到了两个问题:

  1. 当我重新运行程序时,文件重置或写在
  2. 之上
  3. 我在其上打印的字符串未写入其中。
  4. 这里是我创建文件的地方:

    void create_log(){
      flog = open(LOG, O_RDWR | O_CREAT ,0666);
      if(flog < 0){
        if(errno!=EEXIST){
          perror("Couldn't open log for writing");
          exit(0);
        }
      }
      if(lseek(flog, MMF, SEEK_SET) < 0){
        perror("lseek");
        exit(0);
      }
      if(write(flog,"", 1) < 0){
        perror("Couldn't expand flog");
        exit(0);
      }
      if((addr = mmap(NULL, MMF,PROT_READ|PROT_WRITE,MAP_SHARED,flog,0)) == MAP_FAILED){
        perror("mmap");
      }
      sprintf(&addr[pos],"##NEW LOG##\n");
      pos+=strlen(addr) + 1;
    }
    

    这是我写信给我的地方的一个实例:

    void threads(){
      int i;
      for(i=0;i<data.triage;i++){
        tid[i] = i;
        pthread_create(&thread[i],NULL,worker,&tid[i]);
        pthread_mutex_lock(&mutex);
        sprintf(&addr[pos],"Triage %d opened\n",i);
        pos = strlen(addr) + 1;
        pthread_mutex_unlock(&mutex);   
      }
    }
    

    只有这2 sprintfs日志文件会导致:

    ##NEW LOG##
    Triage 0 openTriage 1 openTriage 2 openTriage 3 openTriage 4 opened\n
    

0 个答案:

没有答案