PDA

View Full Version : systemcall unix


dosseg
23-02-2006, 11:00
Salve sto facendo un progettino per la sincronizzazione dei processi, ma non so come aquisire i parametri dalla shell.
Mi sipego meglio, questo è il programmino:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
void fatal(char *s)
{
perror (s);
exit (1);
}

main()
{
pid_t pid;
pid=getpid();
printf("Chiamata a fork...\n");
pid=fork();
if (pid==0) {
printf("###cp file1 file2\n");
execl("/bin/cp","cp","file1","file2",(char*)0);
}
if(pid>0) {
wait((int*)0);
pid=fork();
if(pid==0){
printf("###sort file2 -o file3\n");
execl("/bin/sort","sort","file2","-o","file3",(char*)0);
}
else if (pid>0){
wait((int*)0);
printf("###cat file3\n");
execl("/bin/cat","cat","file3",(char*)0);

}
}
}
adesso il prblema e che file1 file2 file3 vorrei passarli come paramteri dalla shell come posso fare??
grazie

ilsensine
23-02-2006, 11:07
Salve sto facendo un progettino per la sincronizzazione dei processi, ma non so come aquisire i parametri dalla shell.
Non c'entra niente con le syscall; i parametri a un programma si passano dichiarando:
int main(int argc, char **argv)
dove argc è il numero dei parametri che l'utente ha passato, più uno.
I parametri li trovi nell'array argv[]; il primo elemento (argv[0]) è la riga di comando utilizzata per invocare il programma, esclusi i parametri; da argv[1] ad argv[argc-1] trovi i parametri effettivi.

Varie note:
- usa i tag [code] quando posti il codice!
- la fork può fallire
- la exec può fallire
- sostituisci (foo *) 0 con NULL -- decisamente più leggibile
- se devi semplicemente eseguire un programma e attendere subito che termina, utilizza la system().

AnonimoVeneziano
23-02-2006, 11:08
int main (int argc, char *argv[])
{
...
}

chiami il programma come :

./nomeprogramma file1 file2 file3

e durante l'esecuzione ti trovi "file1" in argv[1] , "file2" in argv[2] e "file3" in argv[3] .

Con "argc" puoi assicurarti che vengano passati tutti parametri necessari (nel tuo caso dei 3 file devi assicurarti che sia uguale a 4 perchè in argv[0] ci sta il nome del programma che viene passato anche lui come parametro).

CIao