execvp не будет работать с cut

Я делаю работу в школу, и у меня проблема с командой «вырезать», когда я пытаюсь запустить эту команду в C ++. Так что это мое упражнение -> я хочу запустить эту команду в C ++ -> «cut -d ‘:’ -f5 < file «Я записал текст из файла в переменную ввода в основной функции.
ожидается в результате команды -> «пять», но я получил только сообщение об ошибке «cut: разделитель должен быть один символ
Попробуйте ‘cut —help’ для получения дополнительной информации. «

ты знаешь почему ? Спасибо за помощь 🙂

это мой тестовый код:

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdlib>

const int BUFFER_SIZE = 4096;

using namespace std;

char *argCat[] = { "cat", (char *)0 };
char *argEcho[] = { "echo", "Hello", (char *)0 };
char *argCut[] = { "cut", "-d':'", "-f5", (char *)0};

char *stringCharConvertor(string paString)
{
char * temp = new char[paString.size() + 1];
std::copy(paString.begin(), paString.end(), temp);
temp[paString.size()] = '\0';
return temp;
}

void executeCommand(char** paCommand, string &paOutput, string &paInput)
{
char** arg = paCommand;
bool validInput = paInput == "" ? false : true;

int PARRENT_TO_CHILD[2];
int CHILD_TO_PARRENT[2];
if(pipe(CHILD_TO_PARRENT) < 0)
perror("pipe error");if(validInput)
{

if(pipe(PARRENT_TO_CHILD) < 0)
perror("pipe error");
char* temp = stringCharConvertor(paInput);
write(PARRENT_TO_CHILD[1], temp, strlen(temp));
close(PARRENT_TO_CHILD[1]);
}pid_t PID = fork();
if(PID > 0)
{
int s;
char buffer[BUFFER_SIZE+1];
memset(buffer, '\0', sizeof(buffer));
close[CHILD_TO_PARRENT[1]];
wait(&s);
if(read(CHILD_TO_PARRENT[0], buffer, BUFFER_SIZE) < 0)
printf("error ");
close(CHILD_TO_PARRENT[0]);
paOutput = buffer;
if(validInput)
close(PARRENT_TO_CHILD[0]);
cout << "\n"+paInput;
}
else
if(PID == 0)
{
dup2(CHILD_TO_PARRENT[1], STDOUT_FILENO);
close(CHILD_TO_PARRENT[1]);
close(CHILD_TO_PARRENT[0]);
if(validInput)
{
dup2(PARRENT_TO_CHILD[0], STDIN_FILENO);
close(PARRENT_TO_CHILD[0]);
close(PARRENT_TO_CHILD[1]);
}
if(execvp(arg[0], arg) < 0)
close(CHILD_TO_PARRENT[1]);
}
}int main()
{
string input = "one:two:three:four:five:six:seven:eight:nine:ten";
string output = "";
executeCommand(argCut, output, input);
cout << "\n INPUT: "+input <<endl;
cout << "\n OUTPUT: "+output <<endl;
return 0;
}

-1

Решение

вы должны попытаться заменить

char *argCut[] = { "cut", "-d':'", "-f5", (char *)0};

от

char *argCut[] = { "cut", "-d:", "-f5", (char *)0};

нет необходимости в кавычках

вот какое-то обоснование:
бегущая строка в вашем коде показывает:

[pid  7641] execve("/usr/bin/cut", ["cut", "-d':'", "-f5"], [/* 85 vars */]) = 0

который более или менее эквивалентен звонку

/bin/cut "-d':'" "-f5"

который дает ту же ошибку

На самом деле оболочка удаляет лишние кавычки, как вы можете видеть:

$ echo one:two:three:four:five | strace -f /bin/cut -d':' -f5
execve("/bin/cut", ["/bin/cut", "-d:", "-f5"], [/* 85 vars */]) = 0
=> success

в то время как:

$ echo one:two:three:four:five | strace -f /bin/cut "-d':'" -f5
execve("/bin/cut", ["/bin/cut", "-d':'", "-f5"], [/* 85 vars */]) = 0
=> failure
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]