如何从所有进程可见的进程中设置环境变量?我将 C 与 Glib 一起使用。
我有 10 个使用同一个库的进程。问题是在那个库中执行了一个检查过程(这是 CPU 饥饿的)。我想避免为每个进程执行该库检查过程。对于使用该库的第一个进程来说,这就足够了。
如何从所有进程可见的进程中设置环境变量?我将 C 与 Glib 一起使用。
我有 10 个使用同一个库的进程。问题是在那个库中执行了一个检查过程(这是 CPU 饥饿的)。我想避免为每个进程执行该库检查过程。对于使用该库的第一个进程来说,这就足够了。
这根本不可能。
设置环境变量(或更改当前环境)仅对当前进程的子(和后代)进程可见。
其他进程,特别是父进程(通常是在您启动程序的终端中运行的 shell)不受影响。
您可能会玩一些肮脏的把戏,例如在其中添加线条$HOME/.bashrc
等。但您不应该这样做。
您只需要记录哪些环境变量是相关的。设置环境变量是用户的责任(也许通过手动编辑他的$HOME/.bashrc
等)。将这种自由留给您的用户。向他解释如何做到这一点以及为什么。
你编辑了你的问题来解释
我有 10 个使用同一个库的进程。问题是在那个库中执行了一个检查过程(这是 CPU 饥渴的)。我想避免为每个进程执行该库检查过程。
但是您绝对不需要为此更改环境变量。
你可以
决定并记录不执行检查,除非给出了某些特定的环境变量(或某些程序参数)
决定给检查一个特定的文件名,并使用文件锁定写入来写入该文件,并使用文件锁定读取再次读取它
让检查将其结果写入某个已知的预先文件中,并在决定您要进行昂贵的检查之前阅读该文件
让一个进程启动所有其他进程,并通知他们检查(可能确实设置了一些环境变量或一些程序参数)或使用一些进程间通信技巧与其他进程通信(您可以使用套接字、锁定文件、共享内存、等等等等……)
做许多其他技巧。
那是不可能的。您只能为子进程设置环境。
flock() 听起来可能是您的朋友。
http://beej.us/guide/bgipc/html/multi/flocking.html
您可能还想查看信号量或 SHM(共享内存)。
https://beej.us/guide/bgipc/html/multi/semaphores.html
http://beej.us/guide/bgipc/html/multi/shm.html
这完全取决于您想要的协调水平。文件锁足以让一个进程在我工作的时候离开。信号量和共享内存将允许您协调访问。