Невозможно отправить данные, используя pipe, во второе приложение, которое я запустил через exec (C ++) - PullRequest
0 голосов
/ 26 июня 2018

Я должен передать некоторые данные из одного приложения в другое.Я использую трубу для того же.Мое первое приложение сначала записывает в трубу, а затем исполняет второе приложение.Но при чтении из канала ничего не возвращается.Я разветвляю дочерний процесс, в котором я передаю некоторые данные, используя fd [1].А позже я вызываю другое приложение, используя exec.

Код для чтения данных с использованием fd [0] находится во втором приложении.Но я ничего не получаю. appLaunch.cpp

 int main()
    {
        /*
            This application will send parameters to another application
        */
       int fd[2];
       pid_t childpid;
       char string[] = "Hello, world!\n";
       pipe(fd);
       if((childpid = fork()) == -1)
       {
           perror("fork");
           exit(1);
       }
       if(childpid == 0)
       {
           /* Child process closes up input side of pipe */
           close(fd[0]);
           /* Send "string" through the output side of pipe */
           write(fd[1],string,(strlen(string)+1));
           printf("Starting app...\n");
           execlp("/home/varun/Documents/c programs/C-IPC/app","/home/varun/Documents/c programs/C-IPC/app",NULL);
           exit(0);
       }
       else
       {

       }
       return(0);
    }

app.cpp

int main(int argc, char *argv[])
{
    /*
            This application will read parameters from
            calling process from file descriptors
    */
   int fd[2],nbytes;
   pipe(fd);
   close(fd[1]);
    char readbuffer[80];
    /* Read in a string from the pipe */
    nbytes = read(fd[0],readbuffer, sizeof(readbuffer));
    printf("\nReceived string: %s", readbuffer);
}

1 Ответ

0 голосов
/ 26 июня 2018

Ну, я получил решение.

Мне пришлось открыть канал чтения в дочернем процессе (процесс, который вызывает другое приложение) appLaunch.cpp и записать канал в родительском процессе appLaunch.cpp.И читать его через STDOUT в другом приложении, т.е. app.cpp.Вот код решения: app.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, char *argv[])
{
    /*


            This application will read parameters from
            calling process from file descriptors


    */
  int nbytes;
    printf("\n %s",argv[0]);
    char readbuffer[80];
    /* Read in a string from the pipe */
    nbytes = read(0,readbuffer, sizeof(readbuffer));
    printf("\nReceived string: %s", readbuffer);
    argv[1] = readbuffer;


}

appLaunch.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main()
{
        /*


            This application will send parameters to another application


        */
      // printf("App Launcher is now live!\n");
       int fd[2], nbytes;
       pid_t childpid;
       char string[] = "Hello, world!\n";
       pipe(fd);
       if((childpid = fork()) == -1)
       {
           perror("fork");
           exit(1);
       }
       if(childpid == 0)
       {
           /* Child process closes up input side of pipe */
           close(fd[1]);
           dup2(fd[0],STDIN_FILENO);
           printf("Starting app...\n");
           execlp("/home/varun/Documents/c programs/C-IPC/app","/home/varun/Documents/c programs/C-IPC/app",NULL);
           exit(0);
       }
       else
       {
           close(fd[0]);
           dup2(fd[1],STDOUT_FILENO);
           write(fd[1],string,(strlen(string)+1));
       }
       return(0);
}
...