положить вывод execvp в строку - PullRequest
0 голосов
/ 11 мая 2018

У меня есть оболочка, в которой есть функция, которая в конечном итоге вызывает execvp (...), которая дает выводНапример, «echo hello» выдает «hello».Все работает, не волнуйся.Я очень много тестировал, я просто не поместил полный код здесь, потому что это 1000 строк кода.

Как я могу взять этот вывод из execvp, дублировать его и поместить в строку?

Я знаю, что я использую dup2, но я не знаю, как.

У меня есть это в моем коде:

char* globalString;   //a global string I want to put the output into
char* myString = "one two three ";
char* append = "echo four";
int myPipe[2];  //my pipe  
pipe(myPipe);

, затем я вызываю свою функцию и хочучтобы передать конец записи в канал.

 myfunction( ... , [pointer to write end of pipe]); //i don't know how    

  //ignoring previous code


  cpid = fork();
  if(cpid < 0){
     //Fork wasn't successful 
     perror("fork");
     return -1;
  }

  //in the child
  if(cpid == 0){

     execvp(...);  // in this example, this prints "four" to stdout        

     //execvp returned, wasn't successful
     perror("exec");

     fclose(stdin);  

     exit(127);
  }

//then more code happens
}

в конце я хочу, чтобы вывод из exec был помещен в globalString.Затем я помещаю globalString в myString, чтобы myString было «один два три четыре»

спасибо.

1 Ответ

0 голосов
/ 11 мая 2018

Фрагмент, который я использую для получения вывода из порожденного процесса:

pid_t pid = 0;
int pipefd[2];

pipe(pipefd); //create a pipe
pid = fork(); //spawn a child process
if (pid == 0)
{
   // Child. redirect std output to pipe, launch process
   close(pipefd[0]);
   dup2(pipefd[1], STDOUT_FILENO);
   execv(my_PROCESSNAME, args);
}
//Only parent gets here. make tail nonblocking.
close(pipefd[1]);
fcntl(pipefd[0], F_SETFL, fcntl(pipefd[0], F_GETFL) | O_NONBLOCK);

child_process_output_fd = pipefd[0];  //read output from here
child_process_pid = pid;  //can monitor this for completion with `waitpid`
...