我在Linux系统上运行一个简单的C / CPP进程。这是a.out。
另一个进程能够在其代码中启动a.out。这是b.out。
在a.out中我需要什么代码才能理解它是从命令行执行的? 例如./a.out
有没有办法知道它是从cmd开始还是从另一个进程启动?
答案 0 :(得分:6)
一般情况下,您无法从“命令行”(通过用户的显式命令)查看程序是否已启动,但您可以查看其标准输入和输出是否与终端/命令窗口通信:
#include <unistd.h>
isatty(fileno(stdin))
和stdout
返回标准输入/标准输出是否为终端。
如果您需要知道启动程序的进程,请使用getppid
系统调用获取父进程ID(ppid),然后读取伪文件/proc/
ppid /cmdline
。
答案 1 :(得分:2)
您可以使用getppid()
答案 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
文件并检查此过程是否为cmdline
或b.out
进程。
2)你可以处理shell
系统调用和处理内核参数(你可以google)
3)
sysctl
pid_t ppid = getppid();
将获取任何shell进程的pid并将结果写入
system("pidof bash > text.in");system
文件
它包含所有bash PID的空格分隔,您可以将此值与text.in
值进行比较
祝你好运。