Задать вопрос
@Billy_Milligan

Как работать с PIPE?

Не получается передать структуру через PIPE другой программе. В интернете много примеров с fork(), но сделать тоже самое для 2 разных программ не получается.

1 программа:
int pipefd[2], rs;
    my_struct pipe_msg;
    char buf[sizeof(my_struct)];
    
    rs = pipe(pipefd);
       
       printf("pipe1 = %i, pipe2 = %i\n", pipefd[0], pipefd[1]);
    
        if(rs < 0) {
            printf("    *PIPE [  ERROR  ]\n");
            return -1;
        }

        printf("    *PIPE [  OK  ]\n");

        close(pipefd[1]);

        while(1) {
            read(pipefd[0], buf, sizeof(my_struct));

            if (strcmp("",buf)!=0)
            {
               memcpy(&pipe_msg, &buf[0], sizeof(my_struct));
            }

            memset(buf, 0, sizeof(buf));
        }


2 программа
PS: дескрипторы ставлю 3 и 4.
Делаю так, потому что увидел как тут передают дескриптор второй программе в виде параметра.
int rs;
   my_struct pipe_msg;
   char buf[sizeof(my_struct)];
   int pipefd[2] = {3,4}; //так как и в программе 1, дескрипторы всегда тоже 3 и 4
   
   pipe_msg.val1 = 2;
   pipe_msg.val2 = 3;
   
   memcpy(&buf[0], &pipe_msg, sizeof(my_struct));
    
   write(pipefd[1], &buf, sizeof(my_struct));

   perror("Write:");


Вторая программа выводит: bad file descriptor.
  • Вопрос задан
  • 3359 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Это не будет работать в таком виде. Файловые дескрипторы локальны для процессов. При fork дети наследуют открытые файловые дескрипторы парента, поэтому все работает. Решить эту проблему можно, но так никто не делает. Лучше использовать другой способ коммуникации.
named pipes
Или unix, tcp или udp сокеты в зависимости от того что вы хотите.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Olej
@Olej
инженер, программист, преподаватель
Вторая программа выводит: bad file descriptor.

23626.jpg
Здесь решение всех ваших проблем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы