SEPC Shell exemples

De Ensiwiki
Aller à : navigation, rechercher

Dans cette page vous trouverez des petits exemples d'utilisation de quelques appels systèmes ou de fonctions. Pour le TP Shell, des options avancées de ces fonctions sont nécéssaires mais ne sont pas utilisées ici. Lisez le manuel.

fork, waitpid


pid_t pid;
switch( pid = fork() ) {
case -1:
  perror("fork:");
  break;
case 0:
  printf("Ahhh !!!!!\n");
  break;
default:
  { 
    int status;
    printf("%d, je suis ton père\n", pid);
    waitpid(pid, &status, 0);
    break;
  }
}

pipe, close, dup2


 int res;
 char *arg1[]={"ls","-R", 0};
 char *arg2[]={"egrep","\.c$", 0};
 int tuyau[2];
 pipe(tuyau);
 if((res=fork())==0) {
   dup2(tuyau[0], 0);
   close(tuyau[1]); close(tuyau[0]);
   execvp(arg2[0],arg2);
 }
 dup2(tuyau[1], 1);
 close(tuyau[0]); close(tuyau[1]);
 execvp(arg1[0],arg1);

sigaction


#include <stdio.h>
#include <signal.h>
void bonjour(int sig)
{
  printf("J'ai recu le signal %d\n", sig);
}
int main()
{
  struct sigaction traitant = {};
  traitant.sa_handler = bonjour;
  sigemptyset ( & traitant.sa_mask );
  traitant.sa_flags = 0 ;
  if ( sigaction( SIGTSTP, &traitant, 0) == -1 )
    perror("sigaction");
  printf("presser Ctrl-Z\n");
  /* le terminal envoie le signal SIGTSTP
     lors d'un Ctrl-Z */
  while(1);
}

Readline


#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
int main(int argc, char **argv)
{
  while(1)
    {
      char *seq=NULL;
      seq = readline(">");
      if (seq==NULL) break;
      add_history(seq);
      printf("#### %s\n", seq);
    }
  return 0;
}
	

Il faut bien sur modifier le makefile pour ajouter la bibliothèque. Par exemple si le code précédent est stocké dans un fichier readline.c, le Makefile pour ensibm pourrait être (attention aux blanc et tabulation si vous copier-coller) :


CC=gcc
CFLAGS=-g -Wall -I/opt/freeware/include/
LDFLAGS=-L/opt/freeware/lib  -lreadline -lcurses
readline: readline.o
<code>