根据setproctitle(3),进程标题出现在ps
命令上。但是在查找ps(1)之后,我仍然不知道如何显示它ps
。
主页
/
user-479151
Li-Guangda's questions
Li-Guangda
Asked:
2022-03-11 17:20:11 +0800 CST
鉴于一个简单的程序:
/* 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);
}
将其编译为initttyname
并调用它,结果如下:
Inappropriate ioctl for device
这意味着错误代码是ENOTTY
。
为什么 fprintf(stderr, ....) 在stderr
不引用终端设备时可以输出到屏幕?
Li-Guangda
Asked:
2022-02-27 21:49:15 +0800 CST
给定一个简单的程序,如下:
#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;
}
编译并使其成为init(内核调用的第一个进程),然后重新启动,但它会得到结果:
open() :No such device or address
这要怎么解释?
Li-Guangda
Asked:
2022-02-23 06:19:37 +0800 CST
根据glibc 手册的进程角色部分:
A process also has a real user ID which identifies the user who created the process ...
因此,为了验证这一点,我运行了以下命令:
ps -eo cmd,ruid,euid | grep 'bash\|login'
然后显示(lgd账号的uid为1000):
login --lgd 0 0
-bash 1000 1000
为什么 ruidbash
的值不是 0 ,因为它的创建者login
属于 root 用户?我误解了它还是login
调用函数喜欢setuid()
改变 bash 的 ruid ?
Li-Guangda
Asked:
2022-02-17 20:17:18 +0800 CST
如果我将 bash 作为调用的第一个进程(即作为 init),结果它将显示以下内容:
init: cannot set terminal process group (-1): Inappropriate ioctl for device
init: no job control in this shell
并且没有信号(例如^C,^Z)起作用。
通过阅读bash-5.1.12的源码,问题出在job.c
4501行的表达式:
(t = tcgetpgrp (shell_tty)) == -1
错误值为ENOTTY
,表示调用进程没有控制终端。
为什么 Bash 在作为 init 调用时没有控制终端?
Li-Guangda
Asked:
2022-02-16 20:54:21 +0800 CST
我正在尝试阅读源代码以了解哪个进程负责这些映射,但我仍然无法弄清楚。谁能给我一个关于哪个代码与它相关的提示?