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