【问题标题】:Whether program is executed from command line or invoked through system call程序是从命令行执行还是通过系统调用调用
【发布时间】:2015-05-01 08:48:45
【问题描述】:

平台是 linux,c 代码是在 gcc 中编译的。

是否可以从程序代码内部知道其可执行文件是直接从命令行执行还是通过“system”调用调用的? 例如test.exe 可以直接在命令行上以./test.exe 运行或通过system("/home/mydir/test.exe") 执行我如何知道正在运行的程序内部它是如何被调用的?

【问题讨论】:

  • 命令行解释器使用系统调用来运行程序,从操作系统的角度来看没有区别。
  • 而且system(...)在非交互模式下运行命令行解释器,所以也没有太大区别。
  • 听起来不可能破译@myaut
  • 你可以修改内核,以便在execve系统调用中保存用户空间堆栈,但实现起来非常复杂。
  • 谢谢@Paul!我喜欢你的简单建议

标签: linux command-line executable invoke system-calls


【解决方案1】:

我相信可以通过从int main(int argc, char *argv[]) 解析argv[0] 找到它。如果包含/,则从其路径调用,否则从命令行调用。

【讨论】:

  • 感谢@ahmad 提供如此简单的解决方案 :)
【解决方案2】:

无法确定,因为在一天结束时您最终会执行 execve。你可以使用一些奇怪的启发式方法,比如检查父进程,但这都是废话。

真正的问题是你为什么要关心,或者:实际问题是什么?

如果那个 system() 消费者应该做一些不同的事情,让它要么传递一个特殊的参数,要么设置一个特殊的环境变量传递给那个进程。

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2010-09-10
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多