gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:46:05 24 4
gpt4 key购买 nike

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

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

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

我尝试使用 mmap 来跟踪进程之间的共享内存的进程数量,但无法使其工作,因为在 execv 调用之后,进程只是死亡并且不允许我更新进程计数器。

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

提前谢谢您。

最佳答案

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

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

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

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

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

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

关于c - 在 C 中的 execv 调用中传递指向整数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52569521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com