2016-10-18 9 views
1

Я пытаюсь передать информацию из дочернего процесса в родительский процесс в этой программе. Вот код до сих пор, по-прежнему работает по очистке его:Ошибка при попытке суммирования файла и передачи через трубу/вилку/процесс?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

main() { 

    char *s, buf[1024]; 
    int fds[2]; 
    int sum; 
    s = "Hello world!\n"; 
    FILE *file; 
    pipe(fds); 

    if(fork()==0){ 
     printf("child process: \n"); 
     int c; 
     int number; 
     sum = 0; 

     file = fopen("file1.dat", "r"); 
     if (file) { 
      while ((c = getc(file)) != EOF){ 
       sum+=c;  
       printf("child process: step 1"); 
       fclose(file); 
      } 
     } 

     write(fds[1],&sum,12); 
     exit(0); 
    } 
    read(fds[0],buf,12); 
    write(1,buf,strlen(s)); 

} 

Он компилирует правильно и без ошибок, но возвращается число 6 с последующим связкой непризнанных символов (вопросительных знаков), когда я запускаю его.

Что я могу пропустить? Мои чувства говорят мне что-то с прочитанным.

Редактировать: Я должен добавить, что мое намерение заключается в том, чтобы дочерний процесс открыл и прочитал файл (который содержит несколько строк чисел), и добавьте их, и верните итоговое значение в родительский процесс.

ответ

3

Предполагая sizeof(int) == 4, Вы писали 12 произвольных байтов (4 из которых представляют ценность sumint - остальные 8 байт, дающие неопределенное поведение, так как они не являются частью «того же массива» как sum) на трубу, и то вы читаете их в buf. Затем вы пытаетесь напечатать произвольные байты до стандартного вывода с помощью write().

Вы не проверяете наличие ошибок; вам следует.

Вам нужно преобразовать байты обратно в поток цифр ASCII, чтобы понять значение. Вы должны использовать write(fds[1], &sum, sizeof(sum)), чтобы написать, и read(fds[0], &sum, sizeof(sum)) для чтения, а затем вы можете печатать с printf("%d\n", sum);. Или вы можете сделать преобразование самостоятельно и по-прежнему использовать write() для печати преобразованной строки. Или вы можете сделать преобразование sum в строку цифр в дочернем элементе. Или ...

+0

Благодарим за отзыв. Я посмотрю и посмотрю, это моя проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^