См. Следующий код.Как найти имя терминала, связанное с процессом, надежно в C?
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("ttyname(0): %s\n", ttyname(0));
printf("ttyname(1): %s\n", ttyname(1));
printf("ttyname(2): %s\n", ttyname(2));
printf("ctermid(NULL): %s\n", ctermid(NULL));
/* Sleep for sometime so that we can manually run the ps command to
* see the terminal associated with the process. */
sleep(10);
return 0;
}
Я скомпилирую и запускаю это следующим образом.
$ gcc foo.c
$ ./a.out
ttyname(0): /dev/pts/3
ttyname(1): /dev/pts/3
ttyname(2): /dev/pts/3
ctermid(NULL): /dev/tty
В другом терминале я запускаю команду ps
, чтобы подтвердить имя терминала.
$ ps -ef | grep a.out | grep -v grep
coder 1498 1473 0 19:19 pts/3 00:00:00 ./a.out
Все в порядке до сих пор. Моя программа правильно печатает терминал.
Однако моя программа не может выводить информацию о терминале, когда stdin, stdout, а также stderr перенаправляются следующим образом.
$ ./a.out </dev/null> foo.txt 2> /dev/null
В другом терминале, я бегу ps
и я могу видеть, что на самом деле /dev/pts/3
связан witht он процесс.
$ ps -ef | grep a.out | grep -v grep
coder 1536 1473 0 19:22 pts/3 00:00:00 ./a.out
Но после ./a.out
выходов и проверить свою продукцию в foo.txt
, я не вижу эту информацию в плен.
$ cat foo.txt
ttyname(0): (null)
ttyname(1): (null)
ttyname(2): (null)
ctermid(NULL): /dev/tty
Поскольку ttyname()
не предоставляет какой-либо значимой информации, когда стандартный ввод, стандартный вывод и стандартный поток ошибок перенаправляются и так ctermid()
always returns /dev/tty
, что я могу сделать, чтобы надежно определить терминал, связанный с процессом? Я идеально ищу решение, которое работает в любой стандартной системе Unix или Linux, но если это невозможно, то конкретные решения Linux также в порядке.
Почему, после перенаправления stdin/out/err на/dev/null, вы думаете, что он все еще привязан к терминалу? – KevinDTimm
@KevinDTimm Я не думаю, что он все еще подключен к терминалу. Это не мой вопрос. Я полностью понимаю, что stdin, stdout и stderr не привязаны к терминалу, когда я перенаправляю их. Но процесс все еще связан с терминалом (как вы можете видеть из вывода 'ps'). Если процесс все еще связан с терминалом, как я могу получить это имя терминала из процесса с помощью кода C? Это мой вопрос. –
Gotcha - проверка – KevinDTimm