C管道:错误的文件描述符

时间:2017-11-25 20:10:25

标签: c fork producer-consumer

我在C中使用简单的生产者消费者程序尝试用fork解决它 当生产者尝试在管道上写入时,我确实得到错误: 我已经用相同的逻辑编写了另一个程序,但是这个程序没有给我任何线索知道为什么?

生产者无法在管道上写入项目:错误的文件描述符

任何人都知道我为什么会收到此错误? 感谢

#define READ 0
#define WRITE 1
int mutex = 1, full = 0, empty = BUFFER_SIZE, x = 0;

void consumer();

void producer();

int wait_(int);

int signal_(int);

int pipefd[2];

int main() {
    printf("Starting producer-consumer problem!\n");
    //We intend to run the producer in parent process and the consumer in the child process
    if (pipe(pipefd) == -1) {       /* An error has occurred. */
        fprintf(stderr, "%s", "The call to pipe() has failed.\n");
        exit(EXIT_FAILURE);
    }
    for (int j = 0; j < sizeof(pipefd); j++) {
        if (pipe(&pipefd[j]) < 0) { //Initialize each pipe appropriately
            perror("Error in making pipe...");
        }
    }
    pid_t pid = fork();
    if (pid < 0) {
        perror("**********Error in creating fork()!**************\n");
        exit(STDERR_FILENO);
    } else if (pid == 0) {
        consumer();//We intend to run the consumer in child
    } else {
        producer();//We intend to run the producer in parent
    }
    return 0;
}

int wait_(int s) {
    return (--s);
}

int signal_(int s) {
    return (++s);
}

void producer() {
    printf("Starting Producer\n");
    //while (1) {
    //sleep(1);
    if (close(pipefd[READ]) != 0) {
        perror("Error in closing reading pipe");
    }
    if (write(pipefd[WRITE], &full, 1) < 0) {
        perror("Producer failed to write item on pipe");
    }
    if ((mutex == 1) && (empty != 0)) {
        mutex = wait_(mutex);
        full = signal_(full);
        empty = wait_(empty);
        x++;
        printf("Producer produces the item %d\n", x);
        mutex = signal_(mutex);
    }
    if (close(pipefd[WRITE]) != 0) {
        perror("Error in closing writing pipe");
    }
    //}
}

void consumer() {
    printf("Starting Consumer\n");
    //while (1) {
    //sleep(1);
    int status = 0;
    wait(&status);              /* wait for all children to return back the result */
    if (close(pipefd[WRITE]) != 0) {
        perror("Error in closing reading pipe");
    }
    if (read(pipefd[READ], &full, 1) > 0) {
        printf("Consumer\t%d\n", full);
    }
    if ((mutex == 1) && (full != 0)) {
        mutex = wait_(mutex);
        full = wait_(full);
        empty = signal_(empty);
        printf("Consumer consumes item %d\n", x);
        x--;
        mutex = signal_(mutex);
    }
    if (close(pipefd[READ]) != 0) {
        perror("Error in closing reading pipe");
    }
    //}
}

1 个答案:

答案 0 :(得分:1)

int运算符以字节返回的大小。因此,在sizeof(pipefd)为四个字节的典型系统中,8将产生值pipe(&pipefd[j])。这不是循环元素的正确数量。

此外,pipefd也不正确。 TypeError: Cannot read property 'insert' of undefined 中的两个管道已经已正确“初始化”。不需要再进行初始化。特别是因为在这个和前一个案例中你都会有undefined behavior