Соединительные трубы n linux - PullRequest
0 голосов
/ 10 сентября 2018

Недавно я изучал трубы и увидел ответ:

Соединение n команд с каналами в оболочке?

Я был заинтригован по этому поводу и попытался сделать что-то вроде "динамического", в котором я вводил строку с n-процессом, а затем выполнял n-процесс (т.е. ls | sort). Я пытался токенизировать, сохранить в массиве, но это не сработало. Вот мой код моего «токенизатора»:

int main()
{
  char str[] = "ls | sort";
  int length = (sizeof(str) / sizeof(*str))-1;
  int sizeCMD = 1; //If the string has zero pipe, it means it has at least 1 process
  vector<char> tempV;
  for (int i = 0; i < length; i++)
  {
    if (str[i] == '|')
    {//If the string has one |, it means it has at least 2 process.
      sizeCMD++;
    }
    tempV.push_back(str[i]);//I was going to do something else with this, but I forgot.
    //cout<<i<<" "<<tempV.at(i)<<endl;
  }
  int j = 0;//Current position of the cmd

  string comLetter = "";//it will save every single letter in certain conditions

  string comLine = "";//it will save all the characters of comLetter in certain conditions

  struct command cmd[sizeCMD];
  const char *ls[2];
  const char *sort[2];
  const char *toCChar;
  for (int i = 0; i < tempV.size(); i++)
  {
    if (tempV.at(i) != ' ' && tempV.at(i) != '|')
    {//comLetter will only save characters that are not equal to blank or |.
      //cout<<tempV.at(i);
      comLetter += tempV.at(i);
      //cout<< comLetter <<endl;
    }

    if (tempV.at(i) == ' ' || i == tempV.size() - 1)
    {//comLine will save everything of comLetter when it detects a blank or the very end
      //cout<<comLetter<<endl;
      comLine = comLetter;
      comLetter = "";
    }

    if (tempV.at(i) == '|' || i == tempV.size() - 1)
    {//cmd will save everything of comLine when it detects a | or the very end.
      //cout<<j<<endl;
      cout << "." << comLine << "." << endl;
      //cout<<i<<endl;

      //cout<<toCChar<<endl;

      if(comLine == "ls"){
        toCChar = comLine.c_str();
        ls[0] = toCChar;
        ls[1] = 0;  //THIS IF
        cmd[0] = {ls};                 //WORKS
      }

      if(comLine == "sort"){
        sort[0] = "sort";
        sort[1] = 0;  //THIS IF
        cmd[1] = {sort};                 //WORKS
      }

      /*const char *ls[2];
      cout<<toCChar<<endl;
      ls[0] = toCChar;
      ls[1] = 0;
      cout<< *ls[0] << " - "<< endl;
      cmd[j] = {ls};
      //cout << cmd << endl;
      comLine = "";*/
      j++; //The position will move by one.
    }
  }

  return fork_pipes(sizeCMD, cmd);
}

Все имело смысл для меня, пока я не обнаружил, что const char* не может быть временным, поскольку ему нужны данные, поэтому мне нужно создать 2 массива const char * для 2 команд. Вот почему у меня есть два массива: *sort[] и *ls[] для сортировки и ls.

Кроме того, мне было интересно, почему эти строки «игнорируются»:

toCChar = comLine.c_str();
ls[0] = toCChar;

Я сейчас изо всех сил, если бы кто-нибудь мог бы помочь / подсказать мне, как это сделать, я был бы признателен за это.

...