在C中的execv调用中将指针传递给整数

时间:2018-09-29 14:51:49

标签: c execv

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

我正在尝试在父进程上保持进程计数器。因此,我想到了创建指向变量的指针的可能性,该变量可以跟踪正在运行的进程数。

但是,这似乎是不可能的,因为execv(及其执行的程序)的参数类型为char * const argv[]

我试图使用mmap跟踪进程之间的共享内存的进程数量,但是由于execv调用之后进程就死了,并且不允许我更新进程计数器,因此无法使其正常工作。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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