2015-09-28 2 views
-3

Я написал небольшую программу под названием «л», который принимает стандартное устройство ввода символов и выводит прописные символы на стандартный вывод, см ниже (Примечание: код непосредственно ниже работ по желанию):Трубы и перенаправление, небольшая программа для тестирования понимания

#include <stdio.h> 
int main(int argc, char** argv) { 

char input[500]; 
printf("BLAH HAS STARTED OK......\n"); 
while (!feof(stdin)){ 
    fprintf(stderr, "startloop\n"); 
    input[0]=0; 
    fprintf(stderr, "blocking for input !\n"); 
    fgets(input, 500, stdin); 
    fprintf(stderr, "finished blocking for input !\n"); 
    int index=0; 
    while (input[index]!='\n' && input[index]!=0){ 
     printf("%c", input[index]-32); 
     index++; 
    } 
    if (index==0){ 
     break; 
    } 
    printf("\n"); 
    fprintf(stderr, "endloop\n"); 
} 
printf("BLAH CLOSED.....\n"); 
return 0; 
} 

И еще одна программа, которая создает канал для связи родителя с дочерним устройством, а также канал для связи между родителями и родителями. Затем этот процесс разворачивает дочерний элемент, stdin дочернего процесса перенаправляется на выходной конец родительского канала записи, а stdout дочернего процесса перенаправляется во входной конец родительского канала чтения. Поскольку бла-работа работает, как ожидалось, сама по себе, я ожидал, что тест, написанный в родительскую трубу для записи, вернется в столицах. Может ли кто-нибудь объяснить, что не так с моим пониманием?

#include <stdio.h> 
int main(int argc, char** argv) { 

    int fds1[2]; 
    int fds2[2]; 
    pipe(fds1); 
    pipe(fds2); 
    int pid=fork(); 
    if (pid) { 
    /* parent*/ 
    close(fds1[0]); 
    close(fds2[1]); 
    char val[100]; 
    FILE* parentwrite=fdopen(fds1[1], "w"); 
    FILE* parentread=fdopen(fds2[0], "r"); 
    fprintf(parentwrite, "this text should be printed in capitals\n"); 
    while (!feof(parentread)){ 
     fgets(val, 100, parentread); 
     printf("PARENT PRINTING TEXT FROM CHILD: %s\n", val); 
    } 
    } 
    else 
    { 
    /*child*/ 
    close(fds1[1]); 
    close(fds2[0]); 
    dup2(fds1[0],0); 
    dup2(fds2[1],1); 
    execlp("./blah", "./blah", 0); 
    } 
    return 0; 
} 
+0

пожалуйста, обратите внимание на fprints к STDERR просто, чтобы помочь мне попытаться понять, что происходит - я относительно новым для C –

+1

Вы вставили большой блок кода и сказал *, что случилось с моим пониманием *. Что должен делать код, что он на самом деле делает? Ваша проблема не ясна ... –

+0

Я поправлю свое сообщение, спасибо за отзыв –

ответ

0

Вы не должны быть fdopen ING после pipe() в вашем родительском процессе. Просто напишите/прочитайте, pipe() возвращает открытые дескрипторы файлов, вот почему вы можете их закрыть

0

в целом, используя feof() для управления контуром - это плохая идея, так как это только установлено «истина» ПОСЛЕ того, как прочитывать прошлое входной поток.

предлагает использовать оператор fgets() в инструкции while() для управления контуром. Похожие на:

fprintf(stderr, "startloop\n"); 
while (fgets(input, sizeof(input), stdin)) 
{ 
    fprintf(stderr, "finished blocking for input !\n"); 

    for(index 0; input[index]!='\n' && input[index]!='\0'; index++) 
    { 
     printf("%c", input[index]-32); 
     //printf("%c", input[index]-32); // ??? 32 is a space, relatively meaningless in this scenario 
    } // end for 

    printf("\n"); 
    fprintf(stderr, "endloop\n"); 
} // end while 
Смежные вопросы