我有一个目录监控应用程序,它通过启动新进程递归工作。
我想知道我是否是这棵树中的“根”进程。我想过尝试获取调用者进程的名称,并检查它是否与argv[0]
相同。
有更聪明的方法吗?请记住,这是一个Linux应用程序。
请记住,我没有太多时间,我只是一名学生,所以一个简单的解决方案会很棒。
感谢您的时间。
答案 0 :(得分:5)
如果使用fork()
创建新进程,则可以将一个局部变量初始设置为零,每个子进程在分叉后立即设置为1。在fork之后,只有root进程仍然将它设置为零。
你甚至可以在每个fork之后增加它,这会让你知道每个进程在你的进程树中有多深。
编辑:
如果你不能使用它(例如因为你在fork之后做exec()
),你可以使用shell用来将信息传递给你启动的程序的任何常用方法:
环境变量:在setenv()
之后但在fork()
之前致电exec()
- 或在致电exec()
时将其添加到环境中。
使用特殊的命令行参数。
在执行argv[0]
时为exec()
使用特殊值。
答案 1 :(得分:2)
你有可能添加一个含义“我不是根”的论据吗?这似乎是最简单的方法。
答案 2 :(得分:1)
如果您正在调用exec,请添加一个特殊参数或子进程获取的名为“I_AM_NOT_THE_ROOT”的环境变量,但父进程不会。
我最近使用了一个命令行参数,但env变量可能更方便。