假设我有一个指向线程中某个结构的指针,我想通过管道将它传递给父进程。
MyType * someType;
然后我想将someType
转换为void *
并将其放在管道上。怎么办呢?
答案 0 :(得分:13)
虽然您可以物理地将指针传递给父进程,但该值对于进程来说将毫无意义,并且您的最佳情况将是立即崩溃。指针指示内存中对象的地址。此地址仅在子进程的上下文中有效,并且将指向父进程中完全不同的对象。
您需要执行以下操作之一才能启用此方案
编辑
请注意,我的答案是在问题是询问如何在子进程和父进程之间传递指针时编写的。它后来更新为线程。
答案 1 :(得分:4)
另一种选择是将对象存储在共享内存中,然后将段ID传递给父进程。
父母可以附加到内存并访问/修改对象。
这给出了一些背景知识: http://fscked.org/writings/SHM/shm.html
答案 2 :(得分:2)
在此引用的行和您引用的其他问题之间进行读取,您使用“父进程”来引用主进程线程,并使用“线程”来引用在同一进程中创建的新线程。这会导致您对问题的思考以及其他试图回答问题的人产生混淆。
在这种情况下,只有一个进程,它有两个线程。操作系统启动过程时,第一个线程是为您创建的。第二个是第一个故意创造的。您决定使用管道在这些线程之间进行通信。
首先,我同意很多关于另一个问题的答案,即管道是线程间通信的一个重量级解决方案,因为它们旨在处理进程间通信。也就是说,他们会工作。
其次,请注意,您将无法在进程之间有意义地移动指针。指针仅在单个过程中有效。即使指向共享内存的指针也存在问题,因为共享内存区域可能会映射到每个进程中的不同虚拟地址。由于看起来管道的两端都在同一个过程中,这不是问题,但如果不是这样,那将是一个大问题。
考虑到所有这些,你只需要同意自己对指针的表示。最简单的答案是只将sizeof(void *)
个字节写入管道。读出时,将这些字节放回指针变量,并转换回实数类型。当然,您周围的协议必须知道该类型是什么。
如果您想让两个线程存在于不同的进程中,或者重用此代码来保存(检查点)文件中正在进行的工作,那么您就会遇到更复杂的问题。搜索数据和状态持久性,酸洗和编组的讨论将导致需要考虑的事项。
答案 3 :(得分:1)
将其放在共享内存中,并传递相对于共享内存库的指针。 指针转换取决于编译器如何对齐对象。记住获取相对指针位置时,指针算法基于指向的事物的大小。