Это то, что мой код выглядит следующим образом:Как подключиться к третьему процессу?
#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
$
В дочернем случае поместите printfs после 'read', чтобы ребенок ждал ввода перед печатью чего-либо. – user3386109
спасибо @ user3386109, что исправил его! – Apple
есть пара проблем в коде. 1) Какой ваш компилятор должен был рассказать вам о проблеме возврата указателя на массив символов, который находится в стеке в функции 'reverseestring()' (так эффективно, что массив символов вне диапазона/nolonger существует, когда функции) 2) второй вызов 'fork()' предполагает, что вызов был успешным. Это никогда не рекомендуется принимать вызов системной функции. – user3629249