Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

CTRL-Z

4 réponses
Avatar
Richard
Bonjour,

Sous mac os x 10.6.3, dans un terminal, quand je suspend un programme
avec CTRL-Z, je n'arrive pas à le redémarrer avec fg 0. Le programme
indique une erreur :
error #4 : Interrupted system call
stdin is broken
Abort trap

En clair, le programme a perdu sa liaison avec le clavier.

Ce même programme fonctionne sous Linux où j'arrive à le suspendre et le
redémarrer à volonté sans problème.

Existe t-il un réglage quelque part, voire une modification du programme
à faire, pour arriver à le suspendre et redémarrer à volonté ?

--
Richard

4 réponses

Avatar
OdarR
On 14 mai, 09:19, Richard wrote:
Bonjour,

Sous mac os x 10.6.3, dans un terminal, quand je suspend un programme
avec CTRL-Z, je n'arrive pas à le redémarrer avec fg 0. Le programme
indique une erreur :
error #4 : Interrupted system call
stdin is broken
Abort trap

En clair, le programme a perdu sa liaison avec le clavier.

Ce même programme fonctionne sous Linux où j'arrive à le suspendre et le
redémarrer à volonté sans problème.

Existe t-il un réglage quelque part, voire une modification du programm e
à faire, pour arriver à le suspendre et redémarrer à volonté ?

--
Richard



essaie juste fg.

Olivier
Avatar
Richard
Le 14/05/2010 10:58, OdarR a écrit :
On 14 mai, 09:19, Richard wrote:
Bonjour,

Sous mac os x 10.6.3, dans un terminal, quand je suspend un programme
avec CTRL-Z, je n'arrive pas à le redémarrer avec fg 0. Le programme
indique une erreur :
error #4 : Interrupted system call
stdin is broken
Abort trap

En clair, le programme a perdu sa liaison avec le clavier.

Ce même programme fonctionne sous Linux où j'arrive à le suspendre et le
redémarrer à volonté sans problème.

Existe t-il un réglage quelque part, voire une modification du programme
à faire, pour arriver à le suspendre et redémarrer à volonté ?

--
Richard



essaie juste fg.



Même message d'erreur.
Voilà le problème avec un mini programme :

#include<stdio.h>
int main(void) {
int c = getchar();
printf("%dn", c);
return 0;
}

Je lance je programme, tape CTRL-Z, fg, puis entrée, le Mac affiche -1
(soit EOF), tandis que sous Linux on obtient 10 (soit 'n', le retour à
la ligne).
Tout ce passe comme si CTRL-Z fermait stdin, un peu comme sous Windows
et MSDOS.

--
Richard


--
Richard
Avatar
Éric Lévénez
Le 14/05/10 13:47, Richard a écrit :

Voilà le problème avec un mini programme :

#include<stdio.h>
int main(void) {
int c = getchar();
printf("%dn", c);
return 0;
}

Je lance je programme, tape CTRL-Z, fg, puis entrée, le Mac affiche -1
(soit EOF), tandis que sous Linux on obtient 10 (soit 'n', le retour à
la ligne).
Tout ce passe comme si CTRL-Z fermait stdin, un peu comme sous Windows
et MSDOS.



Non, stdin n'est pas fermé.

Ce qui se passe c'est que le signal SIGTSTP est reçu lors du Ctrl-Z, ce
qui suspend le programme. Puis quand le programme (suite à fg) reprend,
l'appel système en court est interrompu et errno est alors positionné à
EINTR. Ce qui entraîne alors le -1 retourné par getchar.

Avec un truc du genre suivant, cela devrait marcher comme tu le
souhaites (il y a sûrement mieux) :

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

static void handler(int signum)
{
(void)signum;
kill(getpid(), SIGSTOP);
}

int main(void)
{
int c;
struct sigaction sa;

sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGTSTP, &sa, NULL);

c = getchar();
printf("%dn", c);
return 0;
}


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
Richard
Le 14/05/2010 14:54, Éric Lévénez a écrit :

Ce qui se passe c'est que le signal SIGTSTP est reçu lors du Ctrl-Z, ce
qui suspend le programme. Puis quand le programme (suite à fg) reprend,
l'appel système en court est interrompu et errno est alors positionné à
EINTR. Ce qui entraîne alors le -1 retourné par getchar.



OK, merci pour cette explication.

--
Richard