Esempio di shell

di il
2 risposte

Esempio di shell

Allora gente, mentre continuavo le mie esercitazioni per l'esame di Sistemi Operativi mi sono imbattuto in una traccia che non comprendo a pieno, e che quindi ho deciso di condividere con voi..
magari qualcuno di voi sa aiutarmi a capirla, eccola:
Scrivere un esempio di programma di shell che manda in esecuzione processi sia in foreground che in background (senza attendere la terminazione del processo prima di accettare una nuova richiesta).
Ora i punti più oscuri sono:
Come faccio a creare processi in foreground/background?
Ma soprattutto, che tipo di processi dovrei aprire? (faccio delle semplici fork() ed eseguo delle operazioni in background o foreground in base ad una serie di comandi codificati nella shell?)

detto questo, aspetto risposta,
grazie in anticipo
easly

- -- -- EDIT -- -- -
Aggiungo il codice che ho creato per gestire la shell (che è funzionante.. ma che ovviamente al momento non fa nient'altro tranne che stampare a video delle informazioni in base a due comandi:
foreground e background... altrimenti stampa un errore... se si digita exit si chiude la shell.
Ecco il codice:
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main() {
   int pid, i, n, exit = 0;
   char buffer[100], prompt[] = "shell:> ";
   
   while(exit != 1) {
      write(1, prompt, 8);
      bzero(buffer, 100);
      n = read(0, buffer, 100);
      buffer[n-1] = buffer[n];

      if(strcmp(buffer, "exit") == 0) {
         printf("Shell terminata\n");
         return 0;
      }
      
      pid = fork();
      
      if(pid < 0)
         printf("Errore nella generazione del processo.\n");
      else if(pid == 0) {
         if(strcmp(buffer, "foreground") == 0) {
            printf("Il processo sara avviato in foreground\n");
         }
         else if(strcmp(buffer, "background") == 0) {
            printf("Il processo sara avviato in background\n");
         } else
            printf("Comando non riconosciuto\n");
        
         exit = 1;
      }
   }
   
   return 0;
}

2 Risposte

  • Re: Esempio di shell

    Ora i punti più oscuri sono:
    Come faccio a creare processi in foreground/background?
    Ma soprattutto, che tipo di processi dovrei aprire? (faccio delle semplici fork() ed eseguo delle operazioni in background o foreground in base ad una serie di comandi codificati nella shell?)
    le funzioni della famiglia exec rimpiazzano il processo corrente con un nuovo processo, le fork creano un nuovo processo.Detto questo ti ricordo che per eseguire un processo in background su shell si aggiunge il carattere ampersand al comando:
    
    ls &
    [1] 12345
    bla bla bla bla
    
  • Re: Esempio di shell

    Ciao, e grazie per la risposta...
    in ogni caso ho risolto il tutto ed ho creato un esempio di shell che manda in esecuzione processi in background e foreground in base al comando che gli viene passato (ovvero background o foreground)

    ovviamiente avrei dovuto/potuto codificare una shell come si deve, mettere che se c'era l'ampersand allora il processo è background, ma la traccia non lo chiedeva esplicitamente, e quindi mi sono limitato a seguirla

    se a qualcuno può servire il codice, posso postarlo
    Grazie ancora, si può chiudere
Devi accedere o registrarti per scrivere nel forum
2 risposte