【发布时间】:2020-07-01 17:38:54
【问题描述】:
我正在尝试制作一个提示命令并等待用户输入的 shell。
我希望我的 shell 在用户按下 ctrl-c 时打印另一个提示,并在他按下 ctrl-d 时退出。
这是主循环:
int my_shell(char **env)
{
char *cmd_line;
while (true)
{
print_prompt();
cmd_line = get_cmd();
process(cmd_line);
}
return (0);
}
我能够捕捉到ctrl-c 和ctrl-d 信号,但我不知道如何构建主循环以在好地方退出。我尝试使用几个fork()、wait()、getpid(),但我做错了。
这是我的尝试之一:
int extern_pid;
int intern_pid;
int my_shell(char **env)
{
char *cmd_line;
extern_pid = getpid();
while (true)
{
if (fork() == 0)
{
intern_pid = getpid();
print_prompt();
cmd_line = get_cmd();
process(cmd_line);
exit(0);
}
else
{
wait(0);
}
}
return (0);
}
使用这些信号处理程序:
void ctrlc_handler(int signal)
{
if (getpid() == intern_pid)
exit(0);
}
void ctrld_handler(int signal)
{
if (getpid() == extern_pid)
exit(0);
}
注意:ctrl-d 信号在 get_cmd() 函数中处理。
【问题讨论】:
-
ctrl-d 不发送信号。它只是将行中所有累积的字符传递给执行
read的进程,而无需等待(或包括)换行符。 Shell 通常在执行read返回计数 0 时退出,这对应于用户在行首键入 ctrl-d.. -
是的,但我在阅读中处理了它,现在如果我按下它,它会发送一个信号
标签: c shell process signals eof