0

私がやっている :

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

Ctrl+D を実行すると、直接終了します。exit終了する前にbash と write と同じことをするにはどうすればよいですか?

にフラグか何かを追加する必要がありexeclますか?

4

1 に答える 1

2

コンパイルするexecl(...)と、問題なく exit が出力され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

その他の例については、シリアル プログラミング HOWTOを参照してください。

于 2013-03-03T21:31:32.250 に答える