copsa-ctrlc¶
Programa que emet el missatge "Ei! No facis això!!! " cada cop que l’usuari prem simultàniament les tecles <ctrl>` i C.
Guió executable de python
copsa-ctrlc#!/usr/bin/python3 from copsa-ctrlc import copsa-ctrlc copsa-ctrlc()
Mòdul de python
copsa-ctrlc.py#!/usr/bin/python3 import signal, os, sys # gestor del senyal INT (Interrupció des del terminal) def copsaINT(sig_num, frame): signal.signal(signal.SIGINT, copsaINT) # refem l'associació del senyal al gestor. #Si no es fa, el següent cop que #es faci ctrl-c, no passarà per aquí print("Ei! No facis això!!!\n") sys.stdout.flush() def copsa_ctrlc(): signal.signal(signal.SIGINT, copsaINT) # Associació el senyal INT al gestor # copsaInt while True: #Iteració de durada infinita signal.pause(); # procés dormint fins arribada senyal if __name__ == '__main__': copsa_ctrlc()
Fitxer C
copsa-ctrlc.c#include <stdio.h> /* biblioteca d'E/S estandard */ #include <unistd.h> /* biblioteca UNIX estandard */ #include <signal.h> /* biblioteca d'ús de senyals */ /* gestor del senyal INT (Interrupció des del terminal)*/ void copsaINT(int sig_num) { signal(SIGINT, copsaINT);/* refem l'associació del senyal al gestor. Si no es fa, el següent cop que es faci ctrl-c, no passarà per aquí */ printf("Ei! No facis això!!!\n"); fflush(stdout); } int main(int argc, char* argv[]) { signal(SIGINT, copsaINT);/* Associació el senyal INT al gestor copsa_int */ while (1) {pause();} /* Iteració de durada infinita */ }
Un cop descarregats, estudieu que fa i com ho fa cada fitxer. Pel cas del python, en bash, feu:
$ chmod +x copsa-ctrlc $ export PATH=$PATH":." $ copsa-ctrlc
Us anirà sortint el missatge "Ei! No facis això!!! " cada cop que premeu simultàniament les tecles <ctrl> i C.
Trobareu els mateixos resultats des de l’intèrpret:
$ python3 >>> from copsa-ctrlc import copsa-ctrlc >>> copsa-ctrlc()
El programa en C, primer cal compilar-lo (primera línia amb el resultat d’un nou fitxer objecte copsa-ctrlc.o), després muntar-lo (segona línia creant l’executable en codi màquina ecu [1])
$ gcc -c copsa-ctrlc.c $ gcc -o ctrlc copsa-ctrlc.o $ ctrlc
Observacions
Un cop activat el programa no es pot aturar prement les tecles <ctrl> i C. Per fer-ho aneu a un altre terminal, identifique el procés a aturar (amb les comandes ps aux i grep nom executable ) i destruiu el procés mitjançant la comanda kill -9.
Footnotes