【问题标题】:Know if process has been called by exec()知道进程是否已被 exec() 调用
【发布时间】:2018-01-16 09:44:09
【问题描述】:

有什么方法可以知道进程是从 exec() 调用开始运行还是由用户从终端启动?

【问题讨论】:

  • 从终端启动的进程也是通过exec()启动的。
  • 有趣(+1)。出于兴趣,您可以在 Windows 中执行此操作。这在某种程度上使这个问题合法化,至少恕我直言。不过,各种 UNIX 在这方面“更纯粹”,所以很可能不是。
  • parent ID 可以作为提示吗?
  • 检查exec()的返回值。
  • 你可以建立进程树来区分终端启动的进程和其他进程。

标签: c fork exec


【解决方案1】:

对你有帮助:child and parent process id;

getppid() 返回调用的父进程 ID 过程。这将是创建此的进程的 ID 使用 fork() 的进程,或者, (!!!CARE!!!) 如果该进程已经终止,则 此进程已被重新设置为父进程的进程的 ID;

我也会考虑添加额外的程序 arg。

【讨论】:

  • 我选择这个作为答案是因为最后一条评论:我认为最好的方法是在 exec 的调用中使用参数。所以我可以从那里读取参数 argv 和 distinguis 是否该进程已被另一个进程的 exec 调用,或者它是否已从控制台启动。谢谢
【解决方案2】:

所有程序都是通过调用exec 系列函数来启动的。

例如,当您在终端中键入命令时,它会搜索二进制可执行文件forks 并在子进程中调用exec。这将用调用进程(终端)的二进制图像替换新程序的二进制图像。程序将执行,终端进程将wait

paxdiablo 对问题 Please explain exec() function and its family 的这个绝对很棒的回答肯定会帮助您了解 exec 的工作原理。

【讨论】:

  • 非常有趣。我不知道所有程序都是通过调用 exec 启动的。您引用的文章非常具有指导意义。谢谢你的回答。
【解决方案3】:

在 Unix 中,所有进程都是通过使用 fork 系统调用创建的,可以选择后跟 exec 系统调用,即使是那些由用户启动的进程(它们是由用户的 shell fork/exec'd)。

根据你真正想做的事情,库函数isatty() 会告诉你stdinstdoutstderr 是否是tty 设备的文件描述符。即输入来自终端,输出到终端或错误到终端。但是,像

这样的命令
 myprog < somefile 1>someotherfile 2>errorfile

将使用isatty 欺骗代码。但也许这就是你想要的。如果您想根据用户是否从键盘输入输入或输入来自文件来采取不同的操作,isatty 就是您所需要的。

【讨论】:

  • 您的回答似乎很有趣,但在这种情况下,这不是我所需要的。我实际上需要知道一个程序是否需要启动一些 IPC 功能并联系启动它的其他进程,或者如果它是一个孤立的执行,则忘记这些验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
相关资源
最近更新 更多