У меня возникли проблемы с небольшим количеством труб. Я создаю оболочку, и я нахожусь в процессе расширения параметров командной строки.
Я думаю, что мне нужно использовать 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»