2017-11-25 168 views
1

我有简单的生产者消费者程序在C尝试用fork解决它 生产者试图在管道上写入时我得到错误: 我已经写了另一个程序具有相同的逻辑,但这一个不知道为什么?C管道:错误的文件描述符

生产者未能写管道项目:为什么我得到这个错误,错误的文件描述符

任何人有想法? 由于

#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"); 
    } 
    //} 
} 
+0

“READ”和“WRITE”定义在哪里? – Frxstrem

+0

什么是REAd&WRITE值?它是0&1吗? – achal

回答

1

sizeof操作者以字节返回该尺寸。因此,在int为四个字节的典型系统中,sizeof(pipefd)将产生值8。这不是你的循环的正确数量的元素。

另外,pipe(&pipefd[j])也不正确。 pipefd中的两个管道已经已经“适当”初始化。不需要任何更多的初始化。特别是因为在这个和以前的情况下,你将有undefined behavior

+0

谢谢!这解决了我的问题。调用pipe(pipefd)进行初始化足够了吗? – matio

+0

@Metao就是够了。 –

+0

再次感谢您。是否必须关闭管道的写入描述符?如何在迭代器中做到这一点,并确保我们不关闭两次? – matio

相关问题