GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana polling program C untuk masukan pengguna sekaligus melakukan tindakan lain di lingkungan Linux?

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/


Linux
  1. Cara menonaktifkan login jarak jauh untuk pengguna root di mesin Linux

  2. Cara menonaktifkan perintah khusus untuk pengguna tertentu di Linux

  3. Cara mengatur ID proses di Linux untuk program tertentu

  1. Berapa Banyak Grup Unix yang Dapat Menjadi Anggota Pengguna?

  2. Bagaimana saya bisa mengubah tata letak keyboard input saat berada di konsol?

  3. Bagaimana saya bisa mengedit $PATH di linux?

  1. Bagaimana saya bisa mengubah grup default pengguna di Linux?

  2. Bagaimana saya bisa mencari nama pengguna dengan id di linux?

  3. Bagaimana saya bisa memalsukan jumlah RAM yang terpasang untuk program tertentu di Linux?