Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中的execv调用上传递指向整数的指针_C_Execv - Fatal编程技术网

在C中的execv调用上传递指向整数的指针

在C中的execv调用上传递指向整数的指针,c,execv,C,Execv,我正在用C编写一个基本的shell程序,它使用一个父进程来处理shell事件,使用fork()来创建在另一个可执行文件(也是C)上调用execv的子进程 我试图在父进程上保留进程计数器。因此,我考虑了创建一个指向变量的指针的可能性,该变量跟踪有多少进程正在运行 但是,这似乎是不可能的,因为execv(及其执行的程序)的参数类型是char*const argv[] 我曾尝试跟踪使用mmap在进程之间共享内存的进程数量,但由于在execv调用后进程死亡,不允许我更新进程计数器,因此无法使其正常工作

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

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

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

我曾尝试跟踪使用mmap在进程之间共享内存的进程数量,但由于在execv调用后进程死亡,不允许我更新进程计数器,因此无法使其正常工作

总之,我的问题是:有没有一种方法可以让我在execv调用中向另一个程序传递指向整数的指针


提前感谢。

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

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

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

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

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

对于可能比您真正想要的更多的信息,您可以在中阅读ESR的进程间通信技术概述