PDA

View Full Version : [C] Esercizio Sistemi Operativi: qualcuno sa dirmi se lo svolto correttamente?


Fabietto206
13-04-2010, 14:53
Testo del progetto
Si scriva un programma C equivalente al comando di shell “cat /etc/passwd | grep ot > /tmp/foo 2>&1”, utilizzando le chiamate di sistema di Unix.

Ecco la mia soluzione:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>

void fail(char *message) {
perror(message);
exit(1);
}
int main() {
int fd[2];
if (-1 == pipe(fd))
fail("pipe");
if (0 == fork()) {
close(0);
close(1);
if (0 != open("/etc/passwd", O_RDONLY))
fail("open passwd");
if (1 != dup(fd[1]))
fail("dup left");
close(fd[0]);
close(fd[1]);
execlp("cat", "cat", NULL);
fail("exec cat");
} else {
close(0);
close(2);
if (0 != dup(fd[0]))
fail("dup right");
if (2 != open("/tmp/foo", O_WRONLY | O_APPEND | O_CREAT, 0600))
fail("open foo");
close(fd[0]);
close(fd[1]);
execlp("grep", "grep", "-H", "root", NULL);
fail("exec grep");
}
return 0;
}

Fabietto206
15-04-2010, 21:07
Nessuno sa darmi una mano?

alifangelo
15-04-2010, 21:37
Il titolo scrivilo in Italiano.
Il codice indentalo come si deve, così è illegibile.

cionci
16-04-2010, 07:50
Devi usare la fork prima di chiamare la exec. La exec sostituisce l'immagine del processo in esecuzione con quella del processo chiamato, quindi è ovvio che l'esecuzione ti si fermi alla prima exec.

Fabietto206
16-04-2010, 13:16
Ho già provato + volte, ma il codice nn me lo fa indentare, nel senso ke dopo averlo indentato, faccio salva e li continua a caricare e nn va + avanti, quindi nn mi resta ke annullare!!

X il titolo nn so cm fare x correggerlo...

Fabietto206
16-04-2010, 13:17
Devi usare la fork prima di chiamare la exec. La exec sostituisce l'immagine del processo in esecuzione con quella del processo chiamato, quindi è ovvio che l'esecuzione ti si fermi alla prima exec.

Scusami, ma potresti riscrivere il codice in modo corretto? Xkè non ho capito cosa intendi!!

cionci
16-04-2010, 14:17
Non posso fartelo io, devi imparare tu. Se non consoci il sistema fork-exec ti mancano cose molto importanti da studiare.
http://www.osix.net/modules/article/?id=641