如何使用Ctrl + D退出像execl一样的bash?

时间:2013-03-03 21:21:24

标签: c linux bash exec

我在做:

execl("/bin/bash", "/bin/bash", NULL);

当我执行Ctrl + D时,它会直接退出。我怎么能像bash一样在退出之前写exit

我是否必须向execl添加标记或其他内容?

1 个答案:

答案 0 :(得分:2)

当我编译execl(...)时,它打印出 Ctrl-D 退出就好了

#include <unistd.h>

int main(int argc, char **argv)
{
    execl("/bin/bash", "/bin/bash", 0);
    return 0;
}

也许,你做一个fork()或从终端分离或做其他事情,这让bash认为它是非交互式的。

Ctrl-D 通常由终端解释。如果您想自己执行此操作,则必须重置VEOF结构中的termios,然后参阅c_cc了解详细信息。

这是自己处理 Ctrl-D 的简化示例。在处理任何内容之前,它仍然会读取整行,但您明白了

#include <sys/wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char buf[100];
    int fd;
    struct termios tio;
    fd = open("/dev/tty", O_RDWR);
    if (fd < 0) {
        perror("open tty");
        exit(1);
    }

    memset(&tio, 0, sizeof(tio));
    tcgetattr(fd, &tio);
    tio.c_cc[VEOF] = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &tio);

    while (fgets(buf, sizeof(buf), stdin)) {
        if (buf[0] == 4) {
            printf("Got Ctrl-D\n");
            break;
        }
    }

    return 0;
}

此程序从终端读取一行,直到它收到以Ctrl-D开头的行。

有关更多示例,请参阅Serial Programming HOWTO