如何读取/写入匿名共享映射?

时间:2015-07-08 22:35:05

标签: c fork semaphore mmap

尝试使用子进程向匿名共享内存写入消息,然后终止它。然后让父母读取消息。我已经看到了映射输入和放大器的示例。使用通过read&获得的文件描述符输出文件write来电。但不知道如何正确处理这个问题。

int main(void) {
  char *shared; 
  int status;
  pid_t child;

  shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);

  if (shared == MAP_FAILED) {
    perror("mmap");
    return 1;
  }

  child = fork();

  if ( child == -1 ) {
    perror("fork");
    return 1;
  } else if (child == 0) {
    sprintf(shared, "foo");

  } else {
    printf("%s", shared);
    wait(&status);
  }

  if (munmap (shared, sizeof(int)) == -1) {
      perror("munmap");
      return 1;
  }

  return 0;    
}

2 个答案:

答案 0 :(得分:1)

如果您打算使用共享内存,那么尝试通过基础文件上的<script> $('#TextBox1').blur(function() { var sourceElement = document.getElementById("TextBox1"); var targetElement = document.getElementById("TextBox2"); targetElement.value = sourceElement.value; }); </script>read()调用来操纵它是愚蠢的(无论如何都不存在匿名映射) )。如果您想通过write()read()进行通信,那么只需创建一个管道,忘记映射和共享内存。这实际上是一种完全可行的方法。

如果你真的想为此使用共享内存,那么就像 memory 一样使用它。将指向共享内存区域的指针转换为适当的指向对象类型,使用普通赋值进行写入,并使用普通变量/内存访问进行读取。共享内存确实引入了冲突访问和同步的潜在问题,但即使对于您描述的简单情况也没有什么大不了的:只需让父进程成功write()为子进程(或以其他方式通知其终止)试图阅读孩子所写的一切。

您确实如何设置映射,但是:您映射wait()个字节,但这可能不足以映射您尝试写入的消息。总的来说,看起来应该更像这样:

sizeof(int)

答案 1 :(得分:0)

如果您的唯一目标是在子进程和父进程之间进行读/写,那么使用管道是一种更容易实现的方法。它看起来像这样:

    int fd[2]; 
    pipe(fd);

    if((child= fork()) == -1)
    {
            perror("fork");
            exit(1);
    }

    if(child == 0)
    {
            // close read side
            close(fd[0]);

            // write to pipe
            write(fd[1], msg, (strlen(msg));
    }
    else
    {
            //close write side
            close(fd[1]);

            //read what the child wrote. 
            nbytes = read(fd[0], buff, sizeof(buff));
    }