Программа застряла в read () с использованием Pipe () в c - PullRequest
1 голос
/ 13 февраля 2020

Мой код следующий: я использую системный вызов pipe на языке c. Здесь моя программа застряла на read(the_pipe_1[0],recieved,20); перед строкой: printf("DUCKKKKKK\n");

Вывод:

In parent 
Enter the value
In Child

Код:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include<sys/wait.h>

int isPalindrome(char str[]);

int main(int argc, char const *argv[]) {

int the_pipe_1[2];
int the_pipe_2[2];

char recieved[20];
char input[20];
char pal[10];
int palchid;

int  pipeVal = pipe(the_pipe_1);
if (pipeVal == -1 ) {
   printf("Pipe 1 failed\n");
 }
if (pipe(the_pipe_2) == -1 ) {
   printf("Pipe 2 failed\n");
 }

 int forkVal =  fork();

 if (forkVal > 0) {
    printf("In parent \n");
    close(the_pipe_1[0]);
    printf("Enter the value\n");
    gets(input);
    write(the_pipe_1[1],(char) input,20);

    wait(NULL);
    close(the_pipe_2[1]);
    read(the_pipe_2[0],pal,10);
    if(pal == "0")
    {
       printf("Not plaindrome\n");
    }
    else
       printf("Plaindrome\n");

     }


  else if(forkVal == 0)
  {
     printf("In Child\n");
     close(the_pipe_1[1]);

     read(the_pipe_1[0],recieved,20);
     printf("DUCKKKKKK\n");

     printf("Val of recieved %s \n",&recieved );

     palchid = isPalindrome(recieved);
     close(the_pipe_2[0]);
     write(the_pipe_2[1],(char)palchid,10);


   }
   return 0;
 }

int isPalindrome(char str[])
{
   int l = 0;
   int h = strlen(str) - 1;

   while (h > l)
   {
      if (str[l++] != str[h--])
      {
        return 0;
      }
   }
return 1;
}

1 Ответ

1 голос
/ 13 февраля 2020

простой. измените строку на:

write(the_pipe_1[1], input, 20);

, и она работает нормально.

Объяснение: Когда вы приводите input (обычно это 32-битный указатель) к char (который является 8-битным), вы создали указатель на недопустимый адрес. При некоторых доступах это может вызвать ошибку сегментации. Например, вы можете попробовать:

//segmentation fault
printf("input - %s\n", (char)input);

, но для write (), которая работает по-другому (не вдаваясь в причины), это привело к зависанию программы вместо

PS. эта строка никогда не будет истинной:

if(pal == "0")
...