положить вывод из exec () в трубу - PullRequest
0 голосов
/ 10 мая 2018

У меня возникли проблемы с небольшим количеством труб. Я создаю оболочку, и я нахожусь в процессе расширения параметров командной строки. Я думаю, что мне нужно использовать dup2, но у меня возникли проблемы с его реализацией до такой степени, что я просто сбросил весь свой код до того, что у меня был накануне, из-за того, что он сломался. Прямо сейчас у меня есть две функции, которые взаимодействуют друг с другом. Один создает строку, а другой вызывает exec, и мне нужно захватить этот вывод и поместить его в строку в другой функции с помощью канала.

У меня есть функция с именем expand:

...
new = "my username is ";
string = "echo Lazarus";

//make the pipe
int myPipe[2];
pipe(myPipe);
int n;
char buffer[65000];

//call changeString         
changeString(string, myPipe[0], myPipe[1]);

/*currently, this is how I can get a string into the pipe. 
I need to do this in changeString instead.*/
write(myPipe[1], "this is a test", 14); 

//read from the pipe in a loop until EOF
int stillReading = 1;
while(stillReading != 0){
   if((n = read(myPipe[0], buffer, 65000)) >= 0){   
      stillReading = 0;
      buffer[n] = '\0';
   }    
}

close(myPipe[0]);
...

//add the result to the new string
for(int i = 0; i < bufferLength; i++){
   string[stringIndex++] = buffer[i];
}

printf("string is now '%s'\n", string); //should output: 'my username is Lazarus'
...

А потом у меня процесс changeString:

...

cpid = fork();
if(cpid < 0){
   return -1;
}

if(cpid == 0){
   //We are the child!

   //where argList[0] == the first word of string, and argList = string
   //(this works just fine)
   execvp(argList[0], argList);

...

...

Что мне нужно сделать, это поместить некоторый код в changeString (dup2?), Который позволяет мне поместить вывод из exec в новую строку. Так что в конце я получаю new, что «мое имя пользователя - Lazarus»

...