Everything is nice and tidy

This commit is contained in:
Philippe Pittoli 2011-02-20 18:52:23 +01:00
parent 49ba17f549
commit c35774ef36
39 changed files with 233 additions and 0 deletions

52
C_Language/chrono.c Normal file
View File

@ -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()
}

View File

@ -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++;
}
}

61
C_Language/multiChrono.c Normal file
View File

@ -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
}

20
C_Language/strdup.c Normal file
View File

@ -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;
}

27
C_Language/test.c Normal file
View File

@ -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);
}

59
C_Language/voir.c Normal file
View File

@ -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
}