Everything is nice and tidy
parent
49ba17f549
commit
c35774ef36
|
@ -0,0 +1,52 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// creation d'un processus chrono qui compte les secondes
|
||||||
|
// sur le signal SIGINT le processus affiche la valeur du compteur
|
||||||
|
// sur le signal SIGQUIT le processus affiche le compteur et quitte.
|
||||||
|
//
|
||||||
|
// lancer le programme dans une fenetre et tester depuis une autre
|
||||||
|
// kill -2 pid display the timer
|
||||||
|
// kill -3 pid display the timer and stop the process
|
||||||
|
|
||||||
|
|
||||||
|
int nsec = 0 ; // Nombre de secondes
|
||||||
|
|
||||||
|
|
||||||
|
void seconde()
|
||||||
|
{
|
||||||
|
print "coucou\n";
|
||||||
|
alarm(1); // on repositionne l'evenement SIGALRM
|
||||||
|
$nsec = $nsec + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void inter()
|
||||||
|
{
|
||||||
|
// affiche la valeur du compteur
|
||||||
|
print "\n" , $nsec, " secondes ecoulees \n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void arret()
|
||||||
|
{
|
||||||
|
// affiche la valeur du compteur et quitte
|
||||||
|
print "\n" , $nsec, " secondes ecoulees \n";
|
||||||
|
print "Fin du chronometre!";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// debut du programme
|
||||||
|
|
||||||
|
$SIG {"ALRM"} = "seconde"; //#on associe la fct handler au signal SIGALRM(14)
|
||||||
|
$SIG {"INT"} = "inter"; //# idem pour le signal SIGINT (2)
|
||||||
|
$SIG{"QUIT"} = "arret"; //# idem pour le signal SIGQUIT (3)
|
||||||
|
|
||||||
|
alarm(1) ; // on initialise le processus
|
||||||
|
|
||||||
|
print("\ndebut (%d) \n", ); // on affiche le pid et on boucle
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
getc()
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main( int argc, char **argv, char **envp)
|
||||||
|
{
|
||||||
|
// I will display all the environment variables
|
||||||
|
while(*envp != NULL)
|
||||||
|
{
|
||||||
|
printf("%s\n", *envp);
|
||||||
|
*envp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
|
# creation d'un programme "multiChrono.pl" qui va creer un nouveau processus chrono
|
||||||
|
# à chaque fois qu'il recoit le signal SIGTERM
|
||||||
|
# sur le signal SIGINT le processus "multiChrono" envoie ce signal à tous ses fils qui
|
||||||
|
# affichent à leur tour la valeur du compteur
|
||||||
|
# sur le signal SIGQUIT le processus renvoie ce signal à tous ses fils qui
|
||||||
|
# affichent la valeur de leur compteur et quittent.
|
||||||
|
#
|
||||||
|
|
||||||
|
@tab; # liste des fils crées
|
||||||
|
|
||||||
|
sub nouveau
|
||||||
|
{
|
||||||
|
# creation d'un processus
|
||||||
|
$pid=fork();
|
||||||
|
|
||||||
|
if($pid == 0 )
|
||||||
|
{
|
||||||
|
exec "chrono.pl";
|
||||||
|
exit(255);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tab[$#tab + 1] = $pid; # on ajoute le nouveau fils
|
||||||
|
print "nouveau chrono cree ( $pid)\n ";
|
||||||
|
print "liste des fils @tab \n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub inter
|
||||||
|
{
|
||||||
|
# affiche la valeur du compteur
|
||||||
|
# on transmet ce signal à tous les fils
|
||||||
|
|
||||||
|
print "\n on transmet le signal SIGINT a tous les chronometres fils \n";
|
||||||
|
kill 2, @tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub arret
|
||||||
|
{
|
||||||
|
print "\n on transmet le signal SIGQUIT a tous les chronometres fils \n";
|
||||||
|
kill 3, @tab;
|
||||||
|
$tab=(); # on vide le tableau + wait à faire
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# debut du programme
|
||||||
|
# print "\ndebut \n"
|
||||||
|
|
||||||
|
$SIG {"TERM"} = "nouveau"; #on cree un nouveau chrono
|
||||||
|
$SIG {"INT"} = "inter"; # signal SIGINT (2)
|
||||||
|
$SIG{"QUIT"} = "arret"; # SIGQUIT (3)
|
||||||
|
|
||||||
|
print "\nInitialisation - programme principal = $$ \n"; # on affiche le pid et on boucle
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
getc
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
char * strdup2(char *);
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char * chaine1 = "Coucou c'est moi";
|
||||||
|
char * copie = strdup2(chaine1);
|
||||||
|
printf("Chaîne originale : %s \nChaîne copie : %s\n", chaine1, copie);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
char * strdup2(char * t)
|
||||||
|
{
|
||||||
|
char *s, *save;
|
||||||
|
save = s = malloc((strlen(t) + 1)* sizeof(char));
|
||||||
|
while(*s++ = *t++);
|
||||||
|
|
||||||
|
return save;
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void changeDirectory(char * path);
|
||||||
|
void erreur(char *s);
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
changeDirectory("");
|
||||||
|
char * wd = (char *) get_current_dir_name();
|
||||||
|
printf("Répertoire courant : %s\n", wd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeDirectory(char * path)
|
||||||
|
{
|
||||||
|
if(strcmp(path, "") == 0)
|
||||||
|
chdir(getenv("HOME"));
|
||||||
|
else if(chdir(path) != 0 )
|
||||||
|
erreur("Impossible de changer de répertoire");
|
||||||
|
}
|
||||||
|
void erreur(char *s)
|
||||||
|
{
|
||||||
|
perror(s);
|
||||||
|
exit(-2);
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <wait.h>
|
||||||
|
|
||||||
|
// utilise tube, fork, redirection E/S
|
||||||
|
|
||||||
|
// commande : voir enchainant l'execution d'une cde avec more
|
||||||
|
// exemple : ./voir ls -lR $HOME
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int p[2],pid;
|
||||||
|
|
||||||
|
if(argc < 2)
|
||||||
|
{
|
||||||
|
perror("erreur argument");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pipe(p) == -1)
|
||||||
|
{
|
||||||
|
perror("erreur creation tube ");
|
||||||
|
exit(-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid=fork(); // creation du proc. fils
|
||||||
|
|
||||||
|
switch(pid )
|
||||||
|
{
|
||||||
|
case -1:
|
||||||
|
perror("fork1");
|
||||||
|
exit(-3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0 : // le fils traite la commande
|
||||||
|
|
||||||
|
close(1);
|
||||||
|
dup(p[1]); // on recupere forcement le desc. 1 (+ petit possible)
|
||||||
|
close(p[0]);
|
||||||
|
close(p[1]);
|
||||||
|
execvp(argv[1],argv+1);
|
||||||
|
printf("\n*** erreur exec. impossible!");
|
||||||
|
exit(-4);
|
||||||
|
|
||||||
|
default: // le pere fait le "more"
|
||||||
|
|
||||||
|
close(0); // on ferme entree standard
|
||||||
|
dup(p[0]); // on connecte l'entree standard au tube
|
||||||
|
close(p[0]); // pour blocage en lecture
|
||||||
|
close(p[1]);
|
||||||
|
execlp("more","more",0); // si on saisit More par exemple -> message erreur
|
||||||
|
printf("\nerreur execution more \n");
|
||||||
|
exit(-5);
|
||||||
|
}
|
||||||
|
exit(0); // on ne vient jamais ici
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue