我正在尝试制作一个可提示命令并等待用户输入的外壳。我希望我的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()
功能中处理。
我正在尝试制作一个可提示命令并等待用户输入的外壳。我希望我的shell在用户按下ctrl-c时打印另一个提示,并在他按下ctrl-d时退出。这是主循环:...
[不必使用fork创建子进程即可在自定义外壳中处理Ctrl-C信号。一种可能是将信号处理程序与sigsetjmp / siglongjmp一起使用。