programme c - C - Programmation
Marsh Posté le 17-06-2007 à 12:21:05
chris1720 a écrit : Bonjour tout le monde, |
ok. Beaucoup de choses à dire
Tout d'abord, pour bien illustrer ton code, il est nécessaire que tu l'encadres entre des balises [ FIXED ] [ /FIXED ] ou [ CPP ] [ /CPP ] (moi j'ai mis des espaces après les crochets car je veux les montrer mais pour que le forum les interprètes, faut pas que tu mettes d'espace).
Ton code ressortira et sera formaté comme il faut.
Ensuite, je trouve assez étonnant qu'on enseigne aux débutant(e)s des notions comme le pipe et le fork. Ce sont plutôt des notions approfondies de travail sur Unix/Linux. Je vais pas les redévelopper ici étant donné que j'ai écrit un cours complet sur ces outils quand j'enseignais Unix. Tu trouveras ce cours en téléchargement ici http://fr.lang.free.fr/cours/Processus_Csyst_v1.0.pdf
Sinon tu as fait une petite erreur. Il n'y a pas création d'un processus père et fils, il y a un processus (le père) qui crée un second processus (le fils) qui lui-même crée un 3° processus. Donc si on résume le truc, le p1 est le père de p2 qui est lui-même le père du p3. Et p3 est fils de p2 qui est lui-même fils de p1. Sous Unix, les parentés ne vont que 2 par 2 (un père connait son fils et un fils connait son père mais un père ne connaît pas le fils de son fils et donc p1 n'a aucune connaissance de p3)
Voici ton code réécrit avec les commentaires qui vont bien
int main() |
Donc si je comprends bien, ce programme fait un "ls |grep 2006 |grep cnam"
Marsh Posté le 17-06-2007 à 16:33:51
Merci enormement pour votre réponse, votre niveau d'enseignement est trés bon (car j'ai tout compris et niquel votre cours
Dans la lancée pouvez vous egalement m'eclairer sur ce programme :
Code :
|
si j ai bien compris le signal(SIGSTOP, action) va afficher "SIGSTOP attrappe" et passer Continuer à 0 et on sort de la fonction action.
ensuite signal(SIGINT) va afficher "SIGINT attrappe" et on sort de la fonction action.
Et on ne rentre pas dans la boucle while parce que la condition est fausse car Continuer est à 0.
Au final à l'écran on aura : SIGTOP attrappe
SISGINT attrappe
Est-ce bien cela?
Marsh Posté le 17-06-2007 à 23:25:02
chris1720 a écrit : |
Pas tout à fait.
La fonction "signal()" a pour but d'armer (préparer) une action. Mais cette action ne se fera QUE si le processus reçoit un signal (ne pas confondre "recevoir un signal" et "fonction signal()" ).
Par défaut, quand un processus reçoit un signal (envoyé généralement par le biais du kill), il s'arrête. Les noob concluent que "kill" signifie "tuer un processus" mais en fait, cela signifie juste "envoyer un signal à un processus".
Donc quand un processus reçoit un signal, il s'arrête. C'est le comportement par défaut. Mais ce comportement peut être changé.
Il suffit, dans le programme, de
1) écrire une fonction de type "void" et recevant un paramètre "int". Ces éléments sont obligatoires.
Ex:
void toto(int x) |
2) préparer le processus à recevoir un signal x en lui disant "si tu reçois le signal x, faudra que tu lances toto => ex: signal(x, toto)
A partir de là, c'est fini. Le programme se déroule normallement. MAIS s'il reçoit le signal "x", alors toto sera automatiquement appelé. Mais s'il ne reçoit pas le signal "x", alors toto ne sera jamais exécuté. Voir p. 11 et suivantes du même cours que ce matin...
Donc ici, action() ne sera appelée que si le processus reçoit un signal SIGINT ou SIGSTOP. La variable globale "continuer" servant à la gestion interne de "action()" car cette fonction ne peut pas recevoir d'autres paramètres.
Marsh Posté le 18-06-2007 à 13:56:13
Juste pour dire que la réponse par défaut d'un programme à un signal dépend du signal. Pour un bon paquet de signaux (SIGTERM, SIGKILL, SIGINT, SIGSEGV, SIGTRAP...) c'est effectivement de terminer le programme, mais pour d'autre l'action est différente. SIGSTOP par exemple va suspendre l'éxécution du programme, et SIGCONT va reprend l'exécution d'un programme stoppé.
Marsh Posté le 17-06-2007 à 10:27:40
Bonjour tout le monde,
J'ai vu qu'on pouvait laisser un message pour une aide en programmation. Je suis débutante dans ce langage et les cours que je suis sont malheureusement pas top donc j'essaie de trouver de l'aide ailleurs :
En gros je ne sais pas exactement ce que fait ce programme ? à part qu'il y création d'un processus pere et fils et echange de données. Par contre je ne comprends pas la fonction de execlp.
int main()
{
int pfds[2];
int pfds_bis[2];
pipe(pfds);
if(0==fork()){
dup2(pfds[0],0);close(pfds_bis[1]);
pipe(pfds_bis);
if(0==fork()){
dup2(pfds_bis[0],0);close(pfds_bis[1]);
execlp("grep","grep","cnam",NULL);
}else{
dup2(pfds_bis[1],1);close(pfd_bis[0]);
execlp("grep","grep","2006",NULL" );
}
}else}
dup2(pfds[1],1);close(pfds[0]);
execlp("ls","ls",NULL);
}
}