Ich muss ein Programm schreiben, die Pipe senden Dateiname von der Befehlszeile zu untergeordneten Prozess erstellen. Im Kind lesen Sie diese Datei und senden Sie sie mit Hilfe der Pipe zurück. Übergeordneter Prozess sollte die Datei drucken. Wenn ein Fehler im untergeordneten Prozess auftritt, muss der Fehler an den übergeordneten Prozess gesendet werden.Programm, lesen Sie die Datei und senden Sie es an den übergeordneten Prozess mit Rohr
Hier ist mein Code, es drucken einige Junk-Datei Datei (und auch deaktivieren Scrollen im Terminalemulator, wenn ich es ausführen).
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void main(int argc, char *argv[]) {
int pipefd[2];
char buff[100];
int childpid;
int size;
FILE *file;
if (argc != 2) {
printf("usage:\n%s <filename>\n", argv[0]);
exit(1);
}
if (pipe(pipefd) < 0) {
perror("can't open pipe\n");
}
if ((childpid = fork()) == 0) {
sleep(1);
size = read(pipefd[0], buff, sizeof(buff));
file = fopen(buff, "r");
if (file == NULL) {
write(pipefd[1], "Can't open file", 15);
exit(1);
}
while (!feof(file)) {
if (fgets(buff, sizeof(buff), file) == NULL) {
write(pipefd[1], "Error reading file", 18);
} else {
write(pipefd[1], buff, sizeof(buff));
}
}
} else if (childpid > 0) {
size = strlen(argv[1]);
if (write(pipefd[1], argv[1], size) != size) {
perror("Error writing to pipe\n");
}
wait(NULL);
while ((size = read(pipefd[0], buff, sizeof(buff))) > 0) {
write(1, buff, size);
}
}
exit(0);
}
Es sollte 'int main (intargc, char * argv [])' sein. –
Können Sie uns sagen, mit welchem Problem Sie konfrontiert sind? –
Wenn die Datei groß genug ist, haben Sie einen Deadlock; Der Elternteil wartet darauf, dass das Kind stirbt, aber das Kind kann aufgehängt werden, während es darauf wartet, dass der Elternteil das Rohr liest. Sie nehmen bidirektionale Rohre an; Diese sind noch nicht Standard (obwohl sie unter Linux verfügbar sind, glaube ich). Ihr Elternprozess sollte das Schreibende seiner Pipe schließen, wenn es fertig ist, darauf zu schreiben; wohl sollte das Kind das Leseende seiner Leitung schließen, wenn es fertig ist, es zu lesen. –