ps -ef命令的部分输出如下所示:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2012 ? 00:00:01 init [3]
root 2 1 0 2012 ? 00:00:01 [migration/0]
root 3 1 0 2012 ? 00:00:00 [ksoftirqd/0]
root 4 1 0 2012 ? 00:00:00 [watchdog/0]
root 5 1 0 2012 ? 00:00:00 [events/0]
root 6 1 0 2012 ? 00:00:00 [khelper]
root 7 1 0 2012 ? 00:00:00 [kthread]
root 9 7 0 2012 ? 00:00:00 [xenwatch]
root 10 7 0 …Run Code Online (Sandbox Code Playgroud) 有人可以以一种易于理解的方式解释在unix和unix类系统中控制终端的概念吗?它与会话有关吗?如果是,那么如何?
如何获得控制终端的真实名称(如果有,否则为错误)作为路径名?
“实名”是指 not /dev/tty,其他任意进程不能使用它来指代同一个终端。如果可能,我更喜欢将答案作为简单的 shell 代码(如下例所示),否则作为 C 函数。
请注意,即使标准输入被重定向,这也必须工作,因此tty无法使用该实用程序:not a tty在这种情况下会出现错误,因为tty只打印连接到标准输入的终端的文件名。
在 Linux 下,可以使用:
echo "/dev/`ps -p $$ -o tty | tail -n 1`"
Run Code Online (Sandbox Code Playgroud)
但这不是可移植的,因为根据 POSIX,终端名称的格式是 unspecified。
关于 C 函数,ctermid (NULL)returns/dev/tty在这里没用。
注意:根据zsh文档,应该能够做到
zsh -c 'echo $TTY'
Run Code Online (Sandbox Code Playgroud)
但是当标准输入和标准输出都被重定向时,当前(版本 5.0.7)会失败:
$ zsh -c 'echo $TTY > /dev/tty' < /dev/null
/dev/pts/9
$ zsh -c 'echo $TTY > /dev/tty' < /dev/null > /dev/null
/dev/tty
Run Code Online (Sandbox Code Playgroud) 我正在调查通常作为自动化进程(例如 cron、Jenkins)运行的脚本的行为。脚本可以(最终)调用以交互方式运行时行为不同(寻求用户输入)的命令;例如,patch会询问如何处理反向补丁,并svn询问密码,但我需要看看当它们以非交互方式运行时会发生什么。
说服patch它是非交互式的相当容易;我只需要重定向stdout为非 tty:
$ </dev/null > >(cat) /path/to/myscript --args
Run Code Online (Sandbox Code Playgroud)
但是svn,如果存在,将连接到控制终端;编辑要通过的脚本--non-interactive并不是一个真正的选择,因为这来自多个层次,很难确定我是否找到了每个调用。
有没有办法在没有控制终端的情况下以非交互方式调用脚本/命令(所以/dev/tty不存在)?我更喜欢 stdout/stderr 仍然去我的终端。
(我发现了在非交互式 shell 中运行脚本的问题?但该问题的答案讨论了 cron 和用户环境之间的差异;我已经消除了除非交互性之外的所有差异。)
考虑这个示例 C 程序,它写入/dev/tty并且没有命令行选项使其不这样做。
#include <stdio.h>
int main (void) {
FILE* fout = fopen("/dev/tty", "w");
fprintf(fout, "Hello, World!\n");
fclose(fout);
}
Run Code Online (Sandbox Code Playgroud)
如何将它的输出重定向到/dev/nullshell 脚本中?
PS我读了这个答案,但我不太明白。无论如何,我希望得到一个不会修改程序代码源的答案。
这些过程的概念是如何关联在一起- ,,和?backgroundzombiedaemonwithout controlling terminal
我觉得它们在某种程度上很接近,尤其是通过 , 的概念controlling terminal,但是我仍然没有太多信息可以讲故事,就像您需要向阅读有关 Linux 的文章的孩子解释一些事情而不会撒谎。
更新 #1:例如(我不知道这是不是真的)
background---zombie前台进程不能成为zombie,因为zombie是一个没有父进程的后台进程daemon- without ctty-所有daemons无运行ctty,但不是所有的过程,而不ctty是daemonsbackground- daemon-一个background process可以被检索到交互方式重新运行,daemon is notzombie- without ctty-zombie如果有无所谓ctty连接到它或不background- without ctty-processes发送到后台,而他们有ctty,如果成为守护进程或模具ctty是从他们采取job-control background-process daemon zombie-process controlling-terminal
在 Lubuntu 18.04 上,我在 lxterminal 中运行了一个 shell。它的控制终端是当前的伪终端从机:
$ tty
/dev/pts/2
Run Code Online (Sandbox Code Playgroud)
我想知道我当前的控制终端/dev/pts/2和/dev/tty.
/dev/tty就像我当前的控制终端/dev/pts/2:
$ echo hello > /dev/tty
hello
$ cat < /dev/tty
world
world
^C
Run Code Online (Sandbox Code Playgroud)但它们似乎是不相关的文件,而不是一个符号链接或硬链接到另一个:
$ ls -lai /dev/tty /dev/pts/2
5 crw--w---- 1 t tty 136, 2 May 31 16:38 /dev/pts/2
13 crw-rw-rw- 1 root tty 5, 0 May 31 16:36 /dev/tty
Run Code Online (Sandbox Code Playgroud)对于不同控制终端的不同会话,if
/dev/tty保证是它们的控制终端。它如何成为不同的控制终端,而不是符号链接或硬链接?
那么它们之间的关系和区别是什么?任何帮助深表感谢!
这篇文章来自于较早的一个命令`tty`和文件`/dev/tty`的输出都是指当前bash进程的控制终端吗?
从键盘输入的所有输入都通过控制终端是否正确?这意味着如果程序在没有控制终端的情况下运行,它将无法接收任何用户输入。这是否适用于 Linux 中的每种程序?
更新 #1:为了澄清这个问题,当 stdin 被重定向时,我的 Python 寻呼机模块崩溃了:
$ ./pager.py < README.rst
...
File "pager.py", line 566, in <module>
page(sys.stdin)
File "pager.py", line 375, in page
if pagecallback(pagenum) == False:
File "pager.py", line 319, in prompt
if getch() in [ESC_, CTRL_C_, 'q', 'Q']:
File "pager.py", line 222, in _getch_unix
old_settings = termios.tcgetattr(fd)
termios.error: (25, 'Inappropriate ioctl for device')
Run Code Online (Sandbox Code Playgroud)
这是因为我尝试获取描述符以将键盘输入设置为fd = sys.stdin.fileno(). 当stdin被重定向,它的文件描述符不再与任何键盘输入相关联,因此试图设置它失败input-output control的错误。
我被告知要得到这个controlling terminal …