LINUX.ORG.RU

Как надежно определить, что программа запущена в фоновом режиме?


0

0

Как надежно определить, что моя программа запущена в фоновом режиме, типа "localhost% executable [parameters] &" ? Перенаправления in/out в этом случае вроде как не делается, и весь мусор, если я его на консоль буду пихать, обязательно попадет в какой-нибудь vim :( Вот User то порадуется :D


Вообще-то, зависит от системы/шелла. Под Линуксом можно так (не гарантирую, что это - наипростейший способ): 1. Узнаем наш PID и ломимся в соответствующую директорию /proc 2. Смотрим файл stat. Он состоит из полей: pid comm state ppid pgrp session tty tpgid и т.д. Поле comm в скобочках, поле state - большая буква. Нас интересуют поля pgrp и tpgid. pgrp - id группы процесса, а tpgid - id группы, владеющей управляющим терминалом данного процесса. Если они равны, то данный процесс пишет на свой терминал. Если они не равны, то процесс будет писАть в лучшем случае на чужой терминал.

Die-Hard ★★★★★
()

ps -ax
Если в позиции TTY стоит ? то программа в фоне.
Или я не прав?

saper ★★★★★
()

Хочется какй-то портируемый метод. Под Соляркой, например, в /proc/pid/ stat'a нет, ну есть, наверняка какой-то похожий по содержанию, может status. Можно еще налететь с permission'ами (так, предположение :). Вот я такое заявление нашел: 1) a job in the foreground has read and write access to the controlling terminal; 2) a job in the background is denied read access and has conditional write access to the controlling terminal. Хотя вполне возможно, что это обязательное но не достаточное условие. Пока непонятно следующее: 1) Что такое "условный доступ по записи"? 2) Как достать управляющий терминал? 2) Ну и как узнать, например, что read denied? Any comments?

Czar
() автор топика

POSIX threads & signals

По-моему, самое лучшее (и совместимое) решение - предусмотреть два различных режима запуска - фоновый и нефоновый - в зависимости от опций коммандной строки, или переменной окружения, или конфиг-файла. В фоновом соответственно делать демона, и устанавливать какуюнить переменную о том, что мы запущены в фоне. Это, ессно, не сработает для &, но можно считать, что пользователь сам дурак, если документации по твоему сервису не прочел :). Многие UNIXовые программы именно так и сделаны (xdm --nodaemon, например).

bison
()

subject

Сорри, Заглавие в предыдущем сообщении не то :(

bison
()

Всем спасибо! Вот еще один приятный текст: 
http://www.faqs.org/faqs/unix-faq/faq/part3/

How can a process detect if it's running in the background?

First of all: do you want to know if you're running in the
background, or if you're running interactively? If you're
deciding whether or not you should print prompts and the like,
that's probably a better criterion. Check if standard input
is a terminal:

            sh: if [ -t 0 ]; then ... fi
            C: if(isatty(0)) { ... }

In general, you can't tell if you're running in the background.
The fundamental problem is that different shells and different
versions of UNIX have different notions of what "foreground" and
"background" mean - and on the most common type of system with a
better-defined notion of what they mean, programs can be moved
arbitrarily between foreground and background!

UNIX systems without job control typically put a process into the
background by ignoring SIGINT and SIGQUIT and redirecting the
standard input to "/dev/null"; this is done by the shell.

Shells that support job control, on UNIX systems that support job
control, put a process into the background by giving it a process
group ID different from the process group to which the terminal
belongs.  They move it back into the foreground by setting the
terminal's process group ID to that of the process.  Shells that
do *not* support job control, on UNIX systems that support job
control, typically do what shells do on systems that don't
support job control.

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