progsys:index
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| progsys:index [2018/01/16 10:00] – [Envoyer & Recevoir Signaux] orel | progsys:index [2024/03/18 15:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 790: | Line 790: | ||
| int k = atoi(argv[1]); | int k = atoi(argv[1]); | ||
| - | for(int s = 1 ; s < argc ; s++) | + | for(int s = 2 ; s < argc ; s++) |
| for(int i = 0 ; i < k ; i++) { | for(int i = 0 ; i < k ; i++) { | ||
| kill(ppid, atoi(argv[s])); | kill(ppid, atoi(argv[s])); | ||
| Line 809: | Line 809: | ||
| sigemptyset(& | sigemptyset(& | ||
| | | ||
| - | for(int sig = 2 ; sig < NSIGNORT ; sig++) { | + | for(int sig = 1 ; sig < NSIGNORT ; sig++) { |
| sigaction(sig, | sigaction(sig, | ||
| tab[sig] = 0; | tab[sig] = 0; | ||
| Line 920: | Line 920: | ||
| </ | </ | ||
| - | ==== Open Pipe Command ==== | + | ==== Open Pipe Command |
| - | //Le fils bombarde son père de signaux. Voici une version incomplète à modifier, car on perd des signaux !!! Il faut mettre en place un système d' | + | On souhaite disposer d’une fonction |
| - | <code C open_pipe_command.c> | + | int open_pipe_command |
| - | /* correction exo 3.1, DS 2017-2018 */ | + | Cette fonction crée un processus chargé d’exécuter la commande //cmd// avec les arguments //argv//, et renvoie deux descripteurs (dans le tableau fd) permettant respectivement d’écrire vers l’entrée standard de la commande (descripteur fd[1]) et de lire depuis la sortie standard de la commande (descripteur fd[0]). On utilisera pour cela deux tubes permettant d’établir une connexion bidirectionnelle avec le processus exécutant la commande. La fonction retournera le //pid// du processus fils exécutant la commande. |
| + | |||
| + | <code C open_pipe_command.c> | ||
| /* gcc -Wall -std=c99 open_pipe_command.c && ./a.out */ | /* gcc -Wall -std=c99 open_pipe_command.c && ./a.out */ | ||
| Line 975: | Line 977: | ||
| </ | </ | ||
| + | ==== Ctrl-C ==== | ||
| + | |||
| + | Un processus fils est dans le même PGID (process group ID) que son père par defaut (pgid père = pgid fils = pid père). Un kill sur -pid du père envoie le signal à tous le groupe, donc au fils également... | ||
| + | |||
| + | <code C sigint.c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | void handler(int sig) | ||
| + | { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | signal(SIGINT, | ||
| + | |||
| + | if (fork() == 0) | ||
| + | { | ||
| + | printf(" | ||
| + | pause(); | ||
| + | printf(" | ||
| + | exit(EXIT_SUCCESS); | ||
| + | } | ||
| + | |||
| + | printf(" | ||
| + | pause(); | ||
| + | printf(" | ||
| + | return EXIT_SUCCESS; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Timeout ==== | ||
| + | |||
| + | <code C executer-avant-delai.c> | ||
| + | |||
| + | #define _GNU_SOURCE | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | static struct sigaction sa, old; | ||
| + | static sigjmp_buf env; | ||
| + | |||
| + | static void myalarm(int sig) | ||
| + | { | ||
| + | printf(" | ||
| + | siglongjmp(env, | ||
| + | } | ||
| + | |||
| + | int executer_avant_delai( void (*fun)(void *), void *parametre, int delai_en_seconde) | ||
| + | { | ||
| + | int ret = 1; | ||
| + | sa.sa_handler = myalarm; | ||
| + | sa.sa_flags = 0; // SA_RESETHAND; | ||
| + | sigemptyset(& | ||
| + | sigaction(SIGALRM, | ||
| + | |||
| + | alarm(delai_en_seconde); | ||
| + | if(sigsetjmp(env, | ||
| + | fun(parametre); | ||
| + | else | ||
| + | ret = 0; // alarm | ||
| + | alarm(0); | ||
| + | sigaction(SIGALRM, | ||
| + | return ret; | ||
| + | } | ||
| + | </ | ||
progsys/index.1516096851.txt.gz · Last modified: 2024/03/18 15:05 (external edit)
