Difference between revisions of "Prova pratica 21 01 15"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<source lang="text"> Scrivere un programma C di nome filepipe che abbia come unico parametro il pathname di un file di testo. Questo file contiene due comandi con i rispettivi...")
 
Line 1: Line 1:
 
<source lang="text">
 
<source lang="text">
Scrivere un programma C di nome filepipe che abbia come unico parametro il pathname di un file di testo.
+
Es 1: scrivere un programma C di nome filepipe che abbia come unico parametro il pathname di un file di testo.
 
Questo file contiene due comandi con i rispettivi parametri, uno per riga.
 
Questo file contiene due comandi con i rispettivi parametri, uno per riga.
  

Revision as of 17:06, 11 March 2015

Es 1: scrivere un programma C di nome filepipe che abbia come unico parametro il pathname di un file di testo.
Questo file contiene due comandi con i rispettivi parametri, uno per riga.

Il programma deve mettere in esecuzione concorrente I due comandi in modo che l'output del primo venga fornito come input del secondo usando una pipe.
Il programma deve terminare quando entrambi i comandi sono terminati.
Esempio: se il file ffff contiene:
ls -l
tac
il comando:
filepipe ffff
deve restituire lo stesso output del comando:
ls -l | tac
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <s2argv.h>
#include <string.h>

int main(int argc, char *argv[]){
	int pfd[2];
	FILE *file=fopen(argv[1], "r");//apro file in lettura
	char cmd1[256];
	char cmd2[256];
	
	fgets(cmd1, sizeof(cmd1), file);//memorizzo il primo comando in cmd1
	fgets(cmd2, sizeof(cmd2), file);//memorizzo il 2 comando in cmd2

	cmd1[strlen(cmd1)-2]='\0';//tronco la stringa eliminando l'EOL
	cmd2[strlen(cmd2)-2]='\0';
	
	pipe(pfd);//creo i 2 descrittori
	
	switch(fork()){
		case 0:	//figlio fornisce output
			dup2(pfd[1], STDOUT_FILENO);
			close(pfd[0]);
			close(pfd[1]);
			execsp(cmd1); 
			exit(1);
					
		case -1: exit(1);
	}
	switch(fork()){//figlio prende input
		case 0:	
			dup2(pfd[0], STDIN_FILENO);
			close(pfd[0]);
			close(pfd[1]);
			execsp(cmd2); 
			exit(1);
					
		case -1: exit(1);
	}
	int status;
	wait(&status);
	fclose(file);
}