处理信号并编写我自己的shell的过程

问题描述 投票:0回答:1

我正在尝试制作一个可提示命令并等待用户输入的外壳。我希望我的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-cctrl-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时退出。这是主循环:...

c shell process signals eof
1个回答
0
投票

[不必使用fork创建子进程即可在自定义外壳中处理Ctrl-C信号。一种可能是将信号处理程序与sigsetjmp / siglongjmp一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.