началось с командной строки? - PullRequest
1 голос
/ 18 октября 2010

У меня есть простой процесс C / CPP, работающий в системе Linux. Это a.out.

Другой процесс способен запустить a.out внутри своего кода. Это b.out.

Какой код мне нужен внутри a.out, чтобы понять, что он выполняется из командной строки? Например ./a.out

Есть ли способ узнать, запущен ли он из cmd или запущен из другого процесса?

Ответы [ 6 ]

6 голосов
/ 18 октября 2010

В общем, вы не можете узнать, была ли программа запущена «из командной строки» (явной командой пользователя), но вы можете узнать, общаются ли ее стандартный ввод и вывод с окном терминала / команды:

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

и stdout возвращают, являются ли стандартный вход / стандартный вывод клеммами.

Если вам необходимо узнать, с какого процесса начинается ваша программа, используйте getppid системный вызов для получения идентификатора родительского процесса (ppid), а затем чтения псевдофайла /proc/ ppid /cmdline.

2 голосов
/ 18 октября 2010

Вы можете сделать несколько вещей, но ни одна из них не будет на 100% надежной:

  • isatty(0), чтобы проверить, является ли стандартный вход клеммой TTY,

  • проверьте идентификатор родительской задачи (getppid()), затем найдите PID родительского объекта, чтобы сопоставить его с путем к исполняемому файлу (используя все, что вы хотите. весело, используя /proc/)

  • Вы также можете просто взглянуть на настроенные переменные окружения. сделать распечатку всех значений, содержащихся в env. Для этого либо используйте переменную extern environ:

    extern char **environ;

  • или измените ваш main() прототип на:

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

2 голосов
/ 18 октября 2010

Вы можете проверить идентификатор родительской задачи, используя getppid()

1 голос
/ 19 октября 2010

Я бы установил переменную окружения в родительском процессе на какое-то значение (скажем, родительский pid) и попросил бы дочерний процесс проверить это.

Маловероятно, что пользователь оболочки установит эту переменную (назовите ее чем-то маловероятным, чтобы назвать конфликт), поэтому, если для этой переменной установлено ожидаемое значение, вы знаете, что она запускается из родительского процесса. 1003 *

0 голосов
/ 18 октября 2010

Короче говоря: вы не можете делать это напрямую.
В общем: посмотрите, вы можете проверить значение getppid() и сравнить его с bash PID или b.out PID
Чтобы найти процесс внутри таблицы процессов с помощью известного PID с C, вы можете сделать следующее:

1) получить PPID из a.out и выполнить поиск с этим значением в /porc, а затем, если вы найдете папку, проверить файл cmdline и проверить, является ли этот процесс b.out или shell ,

2) вы можете иметь дело с sysctl системным вызовом и иметь дело с параметрами ядра (вы можете погуглить)

3)
pid_t ppid = getppid();<br> system("pidof bash > text.in");

system получит pid любого процесса оболочки и запишет результат в text.in файл
он содержит все разделенные пробелом идентификаторы PID, вы можете сравнить эти значения со значением getppid().
Удачи.

0 голосов
/ 18 октября 2010

Вы можете проверить, является ли его стандартный вход клеммой:

if(isatty(0)) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...