Tugas Anda memerlukan perulangan peristiwa berdasarkan select
atau epoll
. Satu acara yang akan ditunggu adalah input pengguna - saat STDIN_FILENO
menjadi siap untuk dibaca. Lainnya adalah pengatur waktu berkala 1 detik saat Anda perlu melakukan polling pada pengontrol.
Ada beberapa pustaka yang mengimplementasikan perulangan peristiwa untuk Anda sehingga Anda bisa fokus pada peristiwa apa yang perlu Anda tangani dan bagaimana caranya. libevent
adalah salah satu yang tertua, kaya fitur, dan populer.
Saya percaya bahwa cara "Unix" bukanlah dengan meminta input pengguna, tetapi bereaksi terhadap sinyal pengguna. Misalnya, saat pengguna menekan Ctrl-C, proses yang sedang berjalan menerima SIGINT.
Contoh cara menggunakan SIGINT dengan benar untuk menginterupsi loop dapat ditemukan di sini. Menyalinnya ke dalam jawaban seandainya tautan menjadi basi:
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
static volatile sig_atomic_t got_signal = 0;
static void my_sig_handler(int signo)
{
got_signal = 1;
}
int main()
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = &my_sig_handler;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return EXIT_FAILURE;
}
for (;;) {
if (got_signal) {
got_signal = 0;
printf("Received interrupt signal!\n");
}
printf("Doing useful stuff...\n");
sleep(1); /* Sleep is not only useful, it is essential! */
}
return EXIT_SUCCESS;
}
(dalam kasus Anda, sebaiknya letakkan break;
ke dalam if
blokir atau gunakan while(!got_signal)
)
Jawaban sederhananya adalah multi-threading, di mana Anda memiliki utas yang dikerahkan untuk menunggu input pengguna, sementara loop berlanjut. Jadi miliki ini:
char flag = 1;
while (flag) {
// run the loop
// if thing happens deploy the thread which will ask user for input
}
Saya sudah lama tidak melakukan threading, saya pikir halaman ini akan lebih baik daripada saya mencoba menjelaskannya kepada Anda:https://randu.org/tutorials/threads/