首页 > 解决方案 > 在 C 中的 execv 调用中传递指向整数的指针

问题描述

我正在用 C 语言编写一个基本的 shell 程序,它使用父进程来处理 shell 事件,并使用 fork() 来创建在另一个可执行文件(也是 C)上调用 execv 的子进程。

我正在尝试在父进程上保留一个进程计数器。因此,我想到了创建一个指向变量的指针来跟踪有多少进程正在运行的可能性。

但是,这似乎是不可能的,因为 execv (以及由它执行的程序)采用的参数是char * const argv[].

我试图跟踪使用 mmap 在进程之间共享内存的进程数量,但由于在 execv 调用之后进程简单地死掉并且不允许我更新进程计数器,因此无法让它工作。

总之,我的问题是:有没有办法在 execv 调用中将指向整数的指针传递给另一个程序?

先感谢您。

标签: cexecv

解决方案


您无法将指针从一个进程有意义地传递到另一个进程,因为该指针在另一个进程中毫无意义。每个进程都有自己的内存,地址是相对于那个内存空间的。换句话说,虚拟内存管理器让每个进程都假装它拥有整台机器的内存。其他进程根本不可见。

但是,您确实有一些选项可以设置相关进程之间的通信。最明显的一个是管道,您可能已经遇到过。但是,这需要更多的工作,因为您需要确保某个进程始终在侦听管道通信。

另一种简单的可能性是在 fork 和 exec 时只打开文件描述符(请参阅 close-on-exec 标志以了解如何完成后者);虽然mmap不保留exec,但您可以将内存重新映射到子进程中打开的 fd。如果不想传fd,可以将内存mmap到一个临时文件,使用环境变量记录临时文件的名字。

另一种可能性是Posix 共享内存。同样,您可能希望通过环境变量传达 shm 名称,而不是将其硬编码到应用程序中。

请注意,共享 mmap 和共享内存都不是原子的。如果要增加计数器,则需要使用一些锁定机制来避免竞争条件。

对于可能比您真正想要的更多的信息,您可以阅读 ESR 在The Art of Unix Programming 第 7 章中对进程间通信技术的概述。


推荐阅读