从命令行开始?

时间:2010-10-18 09:16:57

标签: c++ c linux

我在Linux系统上运行一个简单的C / CPP进程。这是a.out。

另一个进程能够在其代码中启动a.out。这是b.out。

在a.out中我需要什么代码才能理解它是从命令行执行的? 例如./a.out

有没有办法知道它是从cmd开始还是从另一个进程启动?

6 个答案:

答案 0 :(得分:6)

一般情况下,您无法从“命令行”(通过用户的显式命令)查看程序是否已启动,但您可以查看其标准输入和输出是否与终端/命令窗口通信:

#include <unistd.h>
isatty(fileno(stdin))

stdout返回标准输入/标准输出是否为终端。

如果您需要知道启动程序的进程,请使用getppid系统调用获取父进程ID(ppid),然后读取伪文件/proc/ ppid /cmdline

答案 1 :(得分:2)

您可以使用getppid()

检查其父任务ID

答案 2 :(得分:2)

你可以做多件事,但没有一件是100%可靠的:

  • isatty(0)检查标准输入是否为TTY终端,

  • 检查父任务ID(getppid()),然后查找父ID以将其与其可执行文件的路径匹配(使用您想要的任何内容。调用ps并进行一些解析使用/proc/

  • 做或玩得开心
  • 您还可以查看设置的环境变量。打印env中包含的所有值。为此,请使用extern environ变量:

    extern char **environ;

  • 或将您的main()原型修改为:

    int main(int ac, char **av, char **environ)

答案 3 :(得分:1)

我会在父进程中将一个环境变量设置为某个值(比如父pid),并让子进程检查它。

shell用户不太可能设置此变量(称之为不太可能名称冲突的变量),因此如果将此变量设置为期望值,那么您就知道它是从父进程启动的。 / p>

答案 4 :(得分:0)

您可以检查其标准输入是否为终端:

if(isatty(0)) { ... }

答案 5 :(得分:0)

简而言之:你不能直接这样做 很长一段时间:看看你可以检查getppid()值并将其与bash PID或b.out PID进行比较 要使用带有C的已知PID搜索流程表内的流程,您可以执行以下操作:

1)获取PPID的{​​{1}}并在a.out中使用此值进行搜索,然后如果找到该文件夹​​,请检查/porc文件并检查此过程是否为cmdlineb.out进程。

2)你可以处理shell系统调用和处理内核参数(你可以google)

3)
     sysctl

pid_t ppid = getppid();
system("pidof bash > text.in");
将获取任何shell进程的pid并将结果写入system文件
它包含所有bash PID的空格分隔,您可以将此值与text.in值进行比较 祝你好运。