【问题标题】:Printing void* memory address passed over a pipe in C打印通过 C 中的管道传递的 void* 内存地址
【发布时间】:2015-12-08 15:01:02
【问题描述】:

我正在从管道读取 void* 到内存地址。内存地址是 char* 的地址,如下所示。

char *text=getStringFromFunction(params);
void *adrs=&text;
write(pipefd[1], adrs, sizeof(char *));

现在我正在尝试打印管道另一侧的文本,但我不确定如何仅使用内存地址来获取 char*。这都在同一个进程中,所以我相信我应该能够只用指向它的指针来访问地址空间。以下是我的尝试之一

void *buf;
read(pipefd[0], buf, sizeof(char *));
fprintf(stdout, "buf=%s", (char *) buf);

但它会产生垃圾结果。同样,我在搜索中找不到与此主题相关的任何内容,并提前感谢您的帮助!

【问题讨论】:

  • 每个进程都有自己的虚拟地址空间,这会导致其他物理内存。一个进程中的指针值在另一个进程中完全没有意义。
  • 尝试将数据写入管道而不是地址。
  • 这将在一个进程中完成,不过感谢您的提示。数据会相当大,所以我避免通过管道传递它
  • 代码第一部分中的buf 是什么?而adrs 在第二部分?我认为你把它们弄错了。
  • 在第一个 sn-p 中,您准备变量 adrs,然后将 buf 写入管道。在第二个 sn-p 中,您从管道中读取 adrs,然后打印 buf。我觉得这很令人困惑。

标签: c pointers memory type-conversion


【解决方案1】:

如果这是在同一个进程中,例如,一个线程正在通过管道写入缓冲区地址,而第二个线程正在从管道读取缓冲区地址(基本上您将管道用作一种 FIFO缓冲区地址队列)然后我将使用以下内容。

char *text=getStringFromFunction(params);  // get the pointer to the string
int  nByteWritten = 0;
nByteWritten = write(pipefd[1], &text, sizeof(char *));    // write the pointer into the pipe

然后在读取缓冲区时,我会执行以下操作。做read()时需要提供char *指针的地址。

char *buf;
int  nByteRead = 0;
nByteRead = read(pipefd[0], &buf, sizeof(char *));   // get the address from the pipe
fprintf(stdout, "buf=%s", buf);          // print the string

不确定代码的打印部分是否需要担心释放或释放指针。

有关两个程序之间的信息,请参阅How to send a simple string between two programs using pipes?

【讨论】:

  • 嗯,我试了一下,但它抛出了一个段错误。进行核心跟踪表明问题出在最后一个 fprintf 试图打印“buf”
  • @Clark 你能在调试器中运行它,看看正在写入管道的内容以及从管道中读取的内容吗?
  • @Clark 另一个问题是指针在fprintf() 正在执行的点是否仍然有效。
  • 是的,它正在切换地址空间,正在写入的是:dump=0x7fffec0008c0,正在读取的是:&buf=0x7ffff69e0e18
  • @Clark 您能否提供更多详细信息,以便我理解您所说的“切换地址空间”是什么意思?写入管道的指针值是否与从管道读取的值相同?从管道中读取的地址是否仍然是有效地址,这意味着它都在同一个进程中并且指针地址没有被释放或以其他方式变为无效?
【解决方案2】:

您将指针传递给 char*(即 char**)而不是 char*。试试 void adrs = (void)text。

【讨论】:

    【解决方案3】:

    在:

    char *text=getStringFromFunction(params);
    void *adrs=&text;
    

    adrs 是变量text 的地址,而不是它指向的char*

    当此函数返回时,该地址不再有效。此地址在另一个地址空间中永远无效。

    您可能希望将其更改为void *adrs=text,这将通过管道发送指向字符串的指针。该指针只在同一进程中有效。

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      相关资源
      最近更新 更多