LINUX.ORG.RU

Как узнать pid родительского процесса по pid дочернего ?


0

1

getppid возвращает parent pid текущего процесса, а как можно узнать ppid для процесса с другим pid?
Или как узнать pid всех дочерних процессов для текущего процесса?
Наверно придется в потоке, который обрабатывает sigchild удалять элемент из списка всех дочерних узлов. Сам список будет строго из других потоков (у них маска на sigchild) пополнятся pid'ами дочерних процессов при форке, поэтому не будет дедлока на синхронизации этого списка.
Как лучше сделать? Должно работать не только в linux, но и в unix



Последнее исправление: nerdogeek (всего исправлений: 1)

Первое, что приходит на ум - 4-я строка /proc/$PID/stat . Но, чувствую, это решение не подходит.

Laz ★★★★★
()

как можно узнать ppid для процесса с другим pid

Доступ к исходникам есть? Наладь ipc и просто спроси

как узнать pid всех дочерних процессов для текущего процесса

Ты получаешь pid дочернего процесса при форке, просто запоминай его где-нибудь

Gvidon ★★★★
()

POSIX говорит, что ps должен понимать некоторые флаги: http://pubs.opengroup.org/onlinepubs/009695399/utilities/ps.html. Таким образом кросс-платформенное решение такое:

#include <stdio.h>
#include <unistd.h>

int getppidbypid(int pid)
{
	int p, pp;
	FILE *F;
	char buf[256];

	sprintf(buf, "ps -o pid,ppid -p %d", pid);

	F = popen(buf, "r");
	if (!F) {
		/* Can not run ps */
		return -1;
	}

	while (!feof(F)) {
		if (!fgets(buf, sizeof(buf), F)) {
			pclose(F);
			return -1;
		}

		if (sscanf(buf, "%d %d", &p, &pp) > 0) {
			if (p == pid) {
				pclose(F);
				return pp;
			}
		}
	}

	pclose(F);

	return -1; /* Not found */
}

С тестом: http://pastebin.com/M4nmgwtm

Можно для GNU/Linux сделать через procfs для ускорения.

rymis ★★
()
Ответ на: комментарий от rymis

Да, я пожалуй остановлюсь на хранении pid дочерних. Каждые 50 миллисекунд форкать процесс (popen) в нашем проекте не очень эффективно.

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Да, сохранять их в любом случае полезно. Если надо узнать родителя абстрактного процесса, не имеющего отношения к основному приложению, то такой вариант будет затычкой для систем без procfs, а если свои дети, то надо хранить pid'ы.

rymis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.