簡體   English   中英

如何停止Control-D從C中退出Shell

[英]How to stop control-d from exiting shell in c

我正在編寫自己的外殼程序,並且想阻止用戶使用CTRL+D退出外殼程序。 下面是我檢查EOF的方式,並且能夠捕獲CTRL+D

但是,我的循環進入無限循環並且確實打印, please use _exit一遍又一遍地please use _exit

我怎么能阻止這樣做呢?

謝謝

好的,這似乎可行:

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

void disable_veof(void) {
    struct termios t;
    int r;

    r = tcgetattr(STDIN_FILENO, &t);
    if(r)
        exit(EXIT_FAILURE);
    t.c_cc[VEOF] = _POSIX_VDISABLE;
    r = tcsetattr(STDIN_FILENO, TCSANOW, &t);
    if(r)
        exit(EXIT_FAILURE);
}

void echo_lines(void) {
    char buffer[4096];
    const size_t buffer_len = sizeof buffer;
    ssize_t bytes;
    while( 0 != (bytes = read(STDIN_FILENO, buffer, buffer_len)) ) {
        bytes = write(STDOUT_FILENO, buffer, bytes);
        if(bytes <= 0)
            exit(EXIT_FAILURE);
    }
}

int main() {

    disable_veof();
    echo_lines();
    return EXIT_SUCCESS;
}

如果輸入是規范模式下的終端,則原始io中的EOF (與stdio相反) 不是粘性的

https://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap11.html#tag_11_01_09

輸入的特殊字符,如果設置了ICANON標志,則可以識別。 收到后,所有等待讀取的字節將立即傳遞到進程,而無需等待換行符,並且EOF被丟棄。 因此,如果沒有等待的字節(即EOF發生在行的開頭),則應從read()返回字節計數為零,代表文件結束指示。 如果設置了ICANON,則在處理時應丟棄EOF字符。

除非用戶按住Ctrl+D否則下一個read()應該返回一個正值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM