Eu consegui criar um script de inicialização simples que executa ps f
para obter a árvore de processos. Isso me dá uma boa saída dizendo tudo que eu preciso:
PID TTY STAT TIME COMMAND
281 tty1 Ss 0:00 -bash
383 tty1 S+ 0:00 \_ mc
385 pts/0 Ss 0:00 \_ bash -rcfile .bashrc
408 pts/0 R+ 0:00 \_ ps f
Analisá-lo da última linha leva-me a processar com um TTY real = tty1 (claro que é culpado mc
). Então, finalmente, posso executar meu programa com o número de parsed mc tty como um argumento.
Outra opção seria recuperar o número tty dentro do programa analisando os arquivos '/ proc / PID / stat' como ps
program que contém tanto o tty dev id quanto o pai process id. Mas usar script me faz sentir que é menos dependente do sistema operacional. Amostra '/ proc / PID / stat' abaixo:
383 (mc) R 281 383 281 1025 383 ...
| |_ TTY: test major bits for type and minor for id
|______________ PPID: use to traverse tree
Então, no final, eu criei este código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <gpm.h>
static int find_tty()
{
char buf[256];
char* ptr;
FILE* f;
int r;
char stat;
int ppid,pgrp,sess,tty;
int pid = getpid();
while (pid>0)
{
sprintf(buf,"/proc/%d/stat",pid);
f = fopen(buf,"r");
if (!f)
return 0;
r = fread(buf,1,255,f);
fclose(f);
if (r<=0)
return 0;
buf[r] = 0;
ptr = strchr(buf,')');
if (!ptr || !ptr[1])
return 0;
r = sscanf(ptr+2,"%c %d %d %d %d", &stat,&ppid,&pgrp,&sess,&tty);
if (r!=5)
return 0;
if ( (tty&~63) == 1024 && (tty&63) )
return tty&63;
pid = ppid;
}
return 0;
}
int main(int argc, char* argv[])
{
Gpm_Connect gpm_connect;
// ...
int gpm = Gpm_Open(&gpm_connect,find_tty()/*0*/);
// ...
}