簡體   English   中英

關閉管道獲取錯誤的文件描述符

[英]Close pipes get Bad file descriptor

這是代碼:

#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;
}

當我運行它時,它給了我這個輸出

close1: Bad file descriptor
close2: Bad file descriptor
close1: Bad file descriptor
close2: Bad file descriptor
8798
8799

我想做的是創建兩個2D的管道數組和fork num次。 創建和運行正常,但某些管道無法關閉。 似乎p1 [i] [0]和p2 [i] [1]從未適當地靠近。

您得到EBADFD的原因是您試圖兩次關閉相同的文件描述符。

我在第一個代碼片段中添加了一條print語句,以顯示/跟蹤正在關閉的文件描述符。 如果編譯並運行此程序,您將看到嘗試再次關閉描述符后立即出現錯誤消息。

#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 = 1;
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) {
        printf("Child closing: Pipe1 %d End %d\n", i, 1);
        if (close(p1[i][1]) != 0) {
            perror("close");
            exit(1);
        }
        printf("Child closing: Pipe2 %d End %d\n", i, 1);
        if (close(p2[i][0]) != 0) {
            perror("close");
            exit(1);
        }
        printf("%d\n", getpid());
        exit(0);
    } else if (pid > 0) {
        printf("Parent closing: Pipe1 %d End %d\n", i, 0);
        if (close(p1[i][0]) != 0) {
            perror("close");
            exit(1);
        }
        printf("Parent closing: Pipe1 %d End %d\n", i, 1);
        if (close(p2[i][1]) != 0) {
            perror("close");
            exit(1);
        }
        continue;
    } else {
        perror("fork");
        exit(1);
    }   
}

for (i = 0; i < num; i++) {
    printf("Closing: Pipe1: %d End: %d\n", i, 0);
    if (close(p1[i][0]) != 0) {
        perror("close1"); // <----error
    }
    printf("Closing: Pipe1: %d End: %d\n", i, 1);
    if (close(p1[i][1]) != 0) {
        perror("close");
    }
    printf("Closing: Pipe2: %d End: %d\n", i, 0);
    if (close(p2[i][0]) != 0) {
        perror("close");
    }
    printf("Closing: Pipe2: %d End: %d\n", i, 1);
    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;
}

檢查pid並關閉第一個循環中未關閉的端點。 此代碼假定您根據孩子/父母的需要在特定的管道上讀寫。 您可能需要調整以適應您的用例要求:

#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 = 1;
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 (pid == 0) {
        if (close(p1[i][0]) != 0) {
            perror("close1");
        }
        if (close(p2[i][1]) != 0) {
            perror("close");
        }
    } else {
        if (close(p1[i][1]) != 0) {
            perror("close");
        }
        if (close(p2[i][0]) != 0) {
            perror("close2");
        }
    }
}
for (i = 0; i < num; i++) {
    if (wait(NULL) == -1) {
        perror("wait");
        exit(1);
    }
}
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM