2014-02-11 5 views
3

Ситуация такова: я заставляю процесс открыть html-файл с браузером по умолчанию. Вот как это выглядит в моем случае:Получение PID процесса, созданного с помощью xdg-open

if ((pid=fork())==0) { 
    execlp("/usr/bin/xdg-open", "xdg-open", url, NULL); 
    /*if execlp failed, exit the child*/ 
    exit(0); 
} 

Однако, я хочу, чтобы разжиться PID процесса (открыт браузер), так что я мог бы закрыть его и позже. Но я, кажется, не знаю, как я могу это получить. Пожалуйста, дайте мне знать, если у вас есть предложения.

ответ

0

fork() возвращает pid дочернего процесса родительскому объекту.

У ребенка вы можете приобрести его собственный pid со стандартом getpid().

pid_t child_pid = fork(); 

if (child_pid < 0) { 
    perror("fork"); 
    // error handling 
} else if (!child_pid) { 
    // child goes here 
    pid_t my_pid = getpid(); 
} else { 
    // parent continues here 
} 
1

Вы должны уже иметь PID дочернего процесса, человек страницы вилке() говорит:

В случае успеха, PID дочернего процесса возвращается в родителе, и 0 возвращается в дочернем элементе.

Итак, в дочернем процессе вы обнаруживаете 0 и запускаете свою программу, в родительском pid будет фактический PID ребенка.

В соответствии с вашим комментарием, что произойдет, это то, что процесс xdg-open - кто теперь PID, теперь будет запускать браузер, и у вас нет прямого доступа к PID этого процесса браузера.

В настоящее время единственное, что я могу придумать, это создать еще один дочерний процесс, в котором вы запускаете команду, такую ​​как ps или pgrep. Вы можете проанализировать вывод этой команды, чтобы найти PID браузера, который работающий как дочерний элемент xdg-open. Существует пример чтения выходного сигнала дочернего процесса here

+1

Я так не думаю. В дочернем процессе будет запущен xdg-open. Тем не менее, браузер будет открыт в другом процессе, если я правильно пойму. Таким образом, PID будет отличаться. – elena

+0

@elena: From 'man 3 exec':' Семейство функций exec() заменяет текущий образ процесса новым образцом процесса. «При выполнении замены нет необходимости создавать новый процесс, поэтому новый процесс -id назначается. – alk

+1

Да, я прочитал страницу руководства. Однако, если вы посмотрите на мой пример: execlp («/ usr/bin/xdg-open», «xdg-open», url, NULL), вы увидите, что xdg-open - это замещенный образ процесса. xdg-open, в свою очередь, открывает браузер (поскольку URL-адрес является html-страницей). Браузер будет работать в новом процессе. Поэтому мне нужен PID этого процесса. – elena

Смежные вопросы