【问题标题】:How to know the called program path in C/C++ in Linux?如何知道 Linux 中 C/C++ 中调用的程序路径?
【发布时间】:2016-10-28 14:25:26
【问题描述】:

我在 /usr/bin 中有一个编译的 C 程序说 test 和一个 python 程序说 pgm.py 在 /opt/python/ 中。在 pgm.py 中,我正在调用像 os.system("test arg1 arg2") 这样的 C 程序。 C 程序是否有可能知道它正在被 /opt/python/pgm.py 调用?

【问题讨论】:

  • 获取父进程 ID 并查看您可以获得有关该进程的哪些信息。您可能能够获得类似于python /opt/python/pgm.py 或类似名称的父进程的命令行。
  • @tkausl,由于os.system() 执行为sh -c test arg1 arg2,父进程不会是shell 吗?
  • @tkausl:不同意,根据 SilentMonk 的评论。
  • 只要让 Python 脚本在调用test 时传递其 PID、真实路径以及其他参数即可。
  • 你确定你的问题是我的父母是谁而不是谁应该有权运行我吗?如果是访问问题,您可能应该使用系统特定的访问限制,以保证您的进程不会由未经授权的应用或用户运行。

标签: python c++ c


【解决方案1】:

Misc operating system interfaces 将拥有您想要的信息。 一种方法是让 python 程序将信息写入临时文件, 然后将文件作为 c 行参数传递给 C 程序。

【讨论】:

  • 感谢您的信息。但我的要求是,只有 /op/python/pgm.py 应该能够运行 test.c。所以无论 pgm.py 给出的参数如何,都应该在 test.c 中进行检查
  • 好的,这很难。但是“唯一”是如何唯一的呢?你可以在 test.c 中有一个硬编码的字符串来检查 pgm.py 是调用者。即main() 中的第一件事,在 test.c 中是检查哪个程序调用了它。如果不是 pgm.py,则为 exit()s。否则,(它是pgm.py)然后main()的剩余主体,即业务代码,被允许运行。
  • 此信息可以作为我在答案中谈到的临时文件中的 c-line arg 传递。
  • 任何垃圾程序也可以传递相同的信息,C 程序(test.c) 会认为它是由正版程序调用的。因此,test.c 应该自己找到它们,而不是依赖于传递的参数。但我觉得太难了。
【解决方案2】:

假设您使用类似于 Linux 的东西,您可以使用特定于平台的解决方案。为简单起见,我使用 Python 脚本 test.py 代替二进制文件。

pgm.py

#!/usr/bin/env python
import os

os.system('python test.py')

test.py

#!/usr/bin/env python
import os, errno

pid = os.getpid()

while 1:
    try:
        pid = int(open('/proc/%d/stat' % pid).read().split()[3])
        cmd = os.readlink('/proc/%d/exe' % pid)
        args = open('/proc/%d/cmdline' % pid).read().split('\0')
    except OSError as e:
        if e.errno == errno.EACCES:
            print 'Permission denied for PID=%d' % pid
            break
        raise
    print pid, cmd, args
    if pid == 1:
        break

运行pgm.py 时,我得到了输出...

341 /bin/dash ['sh', '-c', 'python test.py', '']
340 /usr/bin/python2.7 ['python', './pgm.py', '']
13888 /bin/bash ['-bash', '']
Permission denied for PID=13887

因此,您可以在 test 中使用一个简单的比较进行测试,它会做类似的事情。

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2013-10-01
    • 2015-11-21
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多