无法使用管道将数据发送到我通过 exec (C++) 启动的第二个应用程序

Unable to send data using pipe to second app which I launched via exec (C++)

我必须将一些数据从一个应用程序传递到另一个应用程序。我正在使用管道。我的第一个应用程序首先写入管道,然后执行第二个应用程序。但是从管道读取时,它 returns 什么都没有。 我正在分叉一个子进程,在其中我使用 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);
}

好吧,我找到了解决方案。

我必须在 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);
}