Hier ist der Code:schließen Rohre bekommen Bad Dateideskriptors
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
int main(int argc, char **argv) {
int num = 2;
pid_t pid;
int i;
int p1[num][2], p2[num][2];
for (i = 0; i < num; i++) {
if (pipe(p1[i]) == -1) {
perror("pipe");
exit(1);
}
if (pipe(p2[i]) == -1) {
perror("pipe");
exit(1);
}
}
for (i = 0; i < num; i++) {
if ((pid = fork()) == 0) {
if (close(p1[i][1]) != 0) {
perror("close");
exit(1);
}
if (close(p2[i][0]) != 0) {
perror("close");
exit(1);
}
printf("%d\n", getpid());
exit(0);
} else if (pid > 0) {
if (close(p1[i][0]) != 0) {
perror("close");
exit(1);
}
if (close(p2[i][1]) != 0) {
perror("close");
exit(1);
}
continue;
} else {
perror("fork");
exit(1);
}
}
for (i = 0; i < num; i++) {
if (close(p1[i][0]) != 0) {
perror("close1"); // <----error
}
if (close(p1[i][1]) != 0) {
perror("close");
}
if (close(p2[i][0]) != 0) {
perror("close");
}
if (close(p2[i][1]) != 0) {
perror("close2"); // <----error
}
}
for (i = 0; i < num; i++) {
if (wait(NULL) == -1) {
perror("wait");
exit(1);
}
}
return 0;
}
Als ich das laufen, es gibt mir diese Ausgabe
close1: Bad file descriptor
close2: Bad file descriptor
close1: Bad file descriptor
close2: Bad file descriptor
8798
8799
Was ich versuche zwei 2D zu tun ist, zu schaffen Array von Rohren und Gabelnummern. Das Erstellen und Ausführen funktioniert gut, aber einige Pipes können nicht geschlossen werden. Es scheint, dass p1 [i] [0] und p2 [i] [1] niemals näher beieinander liegen.
Hinweis: Sie schließen zweimal, einmal in der Schleife tun die Gabel und einmal in der folgenden Schleife. – isedev
So ein Rohr kann nicht zweimal geschlossen werden? Das zweite Mal gibt einen Fehler? –
Der Fehler ist EBADF, was bedeutet, dass die Datei kein gültiger _open_Dateideskriptor ist. – isedev