>>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /proc/<PID>/fd/0, /proc/<PID>/fd/1, /proc/<PID>/fd/2.
>
>А не подскажите, как бы мне это программно сделать? И возможно ли
>по ссылке программно определить путь к файлу?
#include <unistd.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc<2)
{
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
return 1;
}
char sim_link_name[1000]={0};
char tty_name0[1000]={0};
char tty_name1[1000]={0};
char tty_name2[1000]={0};
int len=-1;
snprintf(sim_link_name, 900, "/proc/%s/fd/0", argv[1]);
len = readlink(sim_link_name, tty_name0, 900);
if (len<0)
{
perror("readlink(0) : ");
return 1;
}
tty_name0[len]='\0';
snprintf(sim_link_name, 900, "/proc/%s/fd/1", argv[1]);
len = readlink(sim_link_name, tty_name1, 900);
if (len<0)
{
perror("readlink(1) : ");
return 1;
}
tty_name1[len]='\0';
snprintf(sim_link_name, 900, "/proc/%s/fd/2", argv[1]);
len = readlink(sim_link_name, tty_name2, 900);
if (len<0)
{
perror("readlink(2) : ");
return 1;
}
tty_name2[len]='\0';
printf("Process PID = %s\nProcess TTY0 = %s\nProcess TTY1 = %s\nProcess TTY2 = %s\n", argv[1], tty_name0, tty_name1, tty_name2);
return 0;
}
Естесственно этот вариант требует взаимодействия со стороны программы, чей TTY определяется, т.к. она может запросто перенаправить свои stdin/stdout/stderr, отстрелиться от консоли, или сделать другую гадость ;)
Надеюсь, как внутри программы взять свой пид вместо argv[1] объяснять не надо? ;)