De acordo com setproctitle(3) , o título do processo aparece no ps
comando. Mas depois de procurar o ps(1) , ainda não tenho ideia de como exibi-lo por ps
.
Li-Guangda's questions
Dado que um programa simples:
/* ttyname.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
char **tty = NULL;
tty = ttyname(fileno(stderr));
if (tty == NULL)
{
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("%s\n", tty);
exit(EXIT_SUCCESS);
}
compile-o como ttyname
e invoque-o como init , o resultado será o seguinte:
Inappropriate ioctl for device
o que significa que o código de erro é ENOTTY
.
Por que o fprintf(stderr, ....) pode ser exibido na tela quando stderr
não se refere a um dispositivo terminal?
Dado que um programa simples, como segue:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd = -1;
if (access("/dev/tty", F_OK) == 0)
{
fd = open("/dev/tty", O_RDWR);
if (fd == -1)
perror("open() :");
}
return 0;
}
compile e faça como init (o primeiro processo invocado pelo kernel), depois reinicie, mas obteria o resultado:
open() :No such device or address
Como explicar isso?
De acordo com a seção A Persona de um Processo do manual glibc:
A process also has a real user ID which identifies the user who created the process ...
Então, para verificar isso, executei o comando:
ps -eo cmd,ruid,euid | grep 'bash\|login'
então mostre (o uid da conta lgd é 1000):
login --lgd 0 0
-bash 1000 1000
Por que o ruid do bash
valor 0 já que seu criador login
pertence ao usuário root? Eu entendi mal ou login
invoca funções como setuid()
alterar o ruid do bash?
Se eu fizer o bash como o primeiro processo invocado (ou seja, como init), como resultado, ele exibirá o seguinte:
init: cannot set terminal process group (-1): Inappropriate ioctl for device
init: no job control in this shell
E nenhum sinal (por exemplo, ^C, ^Z) funciona.
Através da leitura do código fonte do bash-5.1.12, o problema está localizado na expressão da job.c
linha 4501:
(t = tcgetpgrp (shell_tty)) == -1
O valor do erro é ENOTTY
, o que significa que o processo de chamada não possui um terminal de controle.
Por que o Bash está sem um terminal de controle quando invocado como init?
Estou tentando ler o código-fonte para entender qual processo é responsável por esses mapeamentos, mas ainda não consigo descobrir. Alguém pode me dar uma dica sobre qual código é relativo a ele?
código fonte: agetty+login(util-linux project) , systemd