जैसा कि पहले ही कहा गया है, आप sigaction
ctrl-c select
को फंसाने के लिए , या किसी भी मानक इनपुट को फंसाने के लिए उपयोग कर सकते हैं ।
ध्यान दें कि बाद की विधि के साथ आपको TTY सेट करने की भी आवश्यकता है ताकि यह लाइन-ऑन-ए-टाइम मोड के बजाय वर्ण-पर-समय में हो। उत्तरार्द्ध डिफ़ॉल्ट है - यदि आप पाठ की एक पंक्ति में टाइप करते हैं, तो यह रनिंग प्रोग्राम के स्टडिन में नहीं भेजा जाता है जब तक कि आप एंटर नहीं करते हैं।
आप का उपयोग करने की आवश्यकता होगी tcsetattr()
ICANON मोड को बंद करने के फ़ंक्शन , और संभवतः ECHO को भी अक्षम करना होगा। मेमोरी से, आपको प्रोग्राम को बाहर निकलने पर टर्मिनल को वापस ICANON मोड में सेट करना होगा!
पूर्णता के लिए, यहां कुछ कोड मैंने अभी खटखटाए हैं (nb: no error check!) जो एक Unix TTY सेट <conio.h>
करता है kbhit()
और DOS फ़ंक्शन का अनुकरण करता है और getch()
:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>
struct termios orig_termios;
void reset_terminal_mode()
{
tcsetattr(0, TCSANOW, &orig_termios);
}
void set_conio_terminal_mode()
{
struct termios new_termios;
tcgetattr(0, &orig_termios);
memcpy(&new_termios, &orig_termios, sizeof(new_termios));
atexit(reset_terminal_mode);
cfmakeraw(&new_termios);
tcsetattr(0, TCSANOW, &new_termios);
}
int kbhit()
{
struct timeval tv = { 0L, 0L };
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv);
}
int getch()
{
int r;
unsigned char c;
if ((r = read(0, &c, sizeof(c))) < 0) {
return r;
} else {
return c;
}
}
int main(int argc, char *argv[])
{
set_conio_terminal_mode();
while (!kbhit()) {
}
(void)getch();
}