Получение информации о Linux без fork / exec, popen () и system ()

0

Я хочу знать, как получить следующую информацию о системе Linux из C++ без использования fork/exec, popen() и system():

  1. Получить командную строку (имя), которая запустила процесс для данного идентификатора процесса.
  2. Отправка сигнала процессу
  3. Поймать и отобразить все сигналы, которые получает моя программа
  4. Получить идентификатор процесса для любого имени процесса

Любые намеки будут оценены.

Большое вам спасибо за ваше время!

  • 0
    Разве это не четыре вопроса?
Теги:
process
system

3 ответа

2

Я считаю, что информация для 1) содержится в /proc/PID/cmdline

Если вы хотите использовать текущий процесс, вы можете использовать /proc/self / - пригодится, когда вы не знаете pid. Я мало что знаю о C++, но в C вы можете использовать открытые и прочитанные системные вызовы, чтобы избежать этого, что позволяет избежать наложения.

Я думаю, что многие другие ответы, которые вы, вероятно, можете сделать, манипулируя и обрабатывайте записи. я beleive/proc/PID/status сообщает вам о сигналах, которые были заблокированы и игнорируются указанным PID.

Редактирование: немного подумать о 4) вы можете рекурсивно прокручивать записи pid в /proc для поиска вашего имени процесса - это единственный способ, которым я могу думать без forking (вызов "ps" изнутри кода, поскольку другие предлагаемые требования fork/exec). Есть ли какая-то конкретная причина, по которой вы избегаете вилки?

  • 0
    для 1) как насчет тех, которые не имеют ничего внутри / proc / PID / cmdline? Разве я не могу просто открыть поток файлов для чтения из cmdline и найти то, что мне нужно?
1
  1. основная функция процесса принимает этот бит
  2. kill - т.е. http://man7.org/linux/man-pages/man2/kill.2.html
  3. См. 2
  4. Tricky.Requires me think
  • 0
    Можете немного рассказать о первом? Что вы имеете в виду, что основная функция процесса получает этот бит? Как я могу получить доступ к основной функции процесса?
  • 1
    1. Он не говорит об Аргв. Он хочет иметь возможность получить командную строку, которая запустила любой процесс, учитывая его pid.
0
  1. В основном вы можете напечатать argv [0]. Но это не поможет всегда, так как стартовая программа может быть заменена новой из-за вызова fork/exec.
  2. Вам нужно использовать программу командной строки kill или kill system call
  3. Проверьте страницу руководства для sigaction
  4. Я предполагаю, что вы имеете в виду исполняемое имя. Вы можете сделать это ниже, возможно, не работают во всех Unix-системах, но должны работать в Linux.

    ps -ef | grep "program-name" | awk '{print $ 2}'

  • 0
    Мне нужно получить информацию из программы на C или C ++, а не из командной строки :(
  • 0
    Тогда вам может понадобиться отсканировать каталог / proc из вашей программы. / Proc / <pid> / cmdline содержит имя программы.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню