[英]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.