2016-01-28 3 views
2

Это то, что мой код выглядит следующим образом:Как подключиться к третьему процессу?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 

char* reverseString(char*); 

int main(void) 
{ 
    pid_t id; 
    int fd[2], nbytes; 
    char string[80]; 
    char readbuffer[80]; 
    char* reversed; 
    pipe(fd); 

    if((id = fork()) == -1) 
    { 
     perror("fork"); 
     exit(1); 
    } 
    if(id != 0) 
    { 
     close(fd[0]); 
     printf("PARENT\n--------------------\n"); 
     // printf("fork: %d\n", id); 
     printf("my pid is %d\n", getpid()); 
     // printf("my parent's pid is %d\n", getppid()); 
     printf("enter string: "); 
     scanf("%s", string); 
     write(fd[1], string, (strlen(string)+1)); 

    } 
    else 
    { 
     close(fd[1]); 
     printf("CHILD\n--------------------\n"); 
     // printf("fork: %d\n", id); 
     printf("my pid is %d\n", getpid()); 
     // printf("my parent's pid is %d\n", getppid()); 
     nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); 
     printf("Received string: %s\n", readbuffer); 
     reversed = reverseString(readbuffer); 
     printf("Reversed string: %s\n", reversed); 

     pid_t id2; 
     int fd2[2]; 
     char readbuffer2[80]; 

     pipe(fd2); 

     if((id2 = fork()) != 0) 
     { 
      close(fd2[0]); 
      printf("My pid: %d\n", getpid()); 
      write(fd2[1], reversed, (strlen(reversed)+1)); 
     } 
     else 
     { 
      close(fd2[1]); 
      printf("My Child's PID: %d\n", getpid()); 
      nbytes = read(fd2[0], readbuffer2, sizeof(readbuffer2)); 
      printf("Received string2: %s\n", readbuffer2); 
     } 

    } 
    return (0); 
} 

char* reverseString(char* str) 
{ 
    char reversed[80]; 
    int n = strlen(str); 
    for(int i = n - 1, j = 0; i >= 0; i--, j++) 
     reversed[j] = str[i]; 
    reversed[n] = '\0'; 
    return reversed; 
} 

Я пытаюсь трубы обращенной строки в третий процесс раздвоенного во втором процессе, но она не отображается.

Также, после ввода scanf после ввода, печать продолжается до тех пор, пока не будет напечатана дочерняя часть, затем введите строку. Как я могу заставить его печатать все. Это выглядит следующим образом:

PARENT 
-------------------- 
my pid is 821 
enter string: CHILD 
-------------------- 
my pid is 822 
$ 
+0

В дочернем случае поместите printfs после 'read', чтобы ребенок ждал ввода перед печатью чего-либо. – user3386109

+0

спасибо @ user3386109, что исправил его! – Apple

+0

есть пара проблем в коде. 1) Какой ваш компилятор должен был рассказать вам о проблеме возврата указателя на массив символов, который находится в стеке в функции 'reverseestring()' (так эффективно, что массив символов вне диапазона/nolonger существует, когда функции) 2) второй вызов 'fork()' предполагает, что вызов был успешным. Это никогда не рекомендуется принимать вызов системной функции. – user3629249

ответ

3

В reverseString функции вы возвращаете адрес массива, который является автоматическим локальным переменным. Такие переменные уничтожаются при возврате функции.

char* reverseString(char* str) 
{ 
    char reversed[80]; 
    // local array, cannot use it after the function returns 

Либо использовать malloc() для выделения памяти, которые будут сохранены между вызовами функции, или обратный строку InPlace.

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