在 C 中的 execv 调用中传递指向整数的指针
Pass pointer to integer on an execv call in C
我正在用 C 编写一个基本的 shell 程序,它使用父进程来处理 shell 事件,并使用 fork() 创建在另一个可执行文件(也是 C)上调用 execv 的子进程。
我试图在父进程上保留一个进程计数器。因此,我想到了创建一个指向变量的指针的可能性,该变量跟踪有多少进程 运行。
然而,这似乎是不可能的,因为 execv 的参数(以及它执行的程序)采用的类型是 char * const argv[]
。
我曾尝试使用 mmap 来跟踪进程之间的共享内存的进程数量,但无法使其正常工作,因为在 execv 调用之后,进程就死掉了,并且不允许我更新进程柜台.
总而言之,我的问题是:有没有办法让我在对另一个程序的 execv 调用中传递一个指向整数的指针?
提前致谢。
您不能有意义地将指针从一个进程传递到另一个进程,因为该指针在另一个进程中没有意义。每个进程都有自己的内存,地址是相对于那块内存的space。换句话说,虚拟内存管理器让每个进程假装它拥有整个机器的内存;其他进程根本不可见。
但是,您确实有一些选项可用于设置相关进程之间的通信。最明显的是管道,您可能已经遇到过。不过,这需要更多工作,因为您需要确保某些进程始终在侦听管道通信。
另一种简单的可能性是在 fork 和 exec 时让文件描述符保持打开状态(请参阅 close-on-exec 标志以了解如何完成后者);尽管 mmap
未被 exec
保留,您可以将内存重新映射到子进程中打开的 fd。如果不想传fd,可以mmap内存到一个临时文件,用一个环境变量记录临时文件的名字。
另一种可能性是Posix shared memory。同样,您可能希望通过环境变量传达 shm 名称,而不是将其硬编码到应用程序中。
请注意,共享 mmap 和共享内存都不是原子的。如果您要递增计数器,则需要使用一些锁定机制来避免竞争条件。
有关可能比您真正想要的更多的信息,您可以在 Chapter 7 of The Art of Unix Programming 中阅读 ESR 的进程间通信技术概述。
我正在用 C 编写一个基本的 shell 程序,它使用父进程来处理 shell 事件,并使用 fork() 创建在另一个可执行文件(也是 C)上调用 execv 的子进程。
我试图在父进程上保留一个进程计数器。因此,我想到了创建一个指向变量的指针的可能性,该变量跟踪有多少进程 运行。
然而,这似乎是不可能的,因为 execv 的参数(以及它执行的程序)采用的类型是 char * const argv[]
。
我曾尝试使用 mmap 来跟踪进程之间的共享内存的进程数量,但无法使其正常工作,因为在 execv 调用之后,进程就死掉了,并且不允许我更新进程柜台.
总而言之,我的问题是:有没有办法让我在对另一个程序的 execv 调用中传递一个指向整数的指针?
提前致谢。
您不能有意义地将指针从一个进程传递到另一个进程,因为该指针在另一个进程中没有意义。每个进程都有自己的内存,地址是相对于那块内存的space。换句话说,虚拟内存管理器让每个进程假装它拥有整个机器的内存;其他进程根本不可见。
但是,您确实有一些选项可用于设置相关进程之间的通信。最明显的是管道,您可能已经遇到过。不过,这需要更多工作,因为您需要确保某些进程始终在侦听管道通信。
另一种简单的可能性是在 fork 和 exec 时让文件描述符保持打开状态(请参阅 close-on-exec 标志以了解如何完成后者);尽管 mmap
未被 exec
保留,您可以将内存重新映射到子进程中打开的 fd。如果不想传fd,可以mmap内存到一个临时文件,用一个环境变量记录临时文件的名字。
另一种可能性是Posix shared memory。同样,您可能希望通过环境变量传达 shm 名称,而不是将其硬编码到应用程序中。
请注意,共享 mmap 和共享内存都不是原子的。如果您要递增计数器,则需要使用一些锁定机制来避免竞争条件。
有关可能比您真正想要的更多的信息,您可以在 Chapter 7 of The Art of Unix Programming 中阅读 ESR 的进程间通信技术概述。