Использование chdir () вызывает ошибку сегментации

Пишу пакетный эмулятор как личный проект. Я пытаюсь реализовать команду cd, используя chdir () из unistd.h. Однако, использование этого вызывает segfault.

main.cpp:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

//Custom headers
#include "splitting_algorithm.hpp"#include "lowercase.hpp"#include "chdir.hpp"
//Used to get and print the current working directory
#define GetCurrentDir getcwd

using namespace std;

int main(int argc, char* argv[])
{
string command;

//Begin REPL code
while (true)
{
//Prints current working directory
cout<<cCurrentPath<<": ";

std::getline(std::cin, command);

vector<string> tempCommand = strSplitter(command, " ");

string lowerCommand = makeLowercase(string(strSplitter(command, " ")[0]));

//Help text
if(tempCommand.size()==2 && string(tempCommand[1])=="/?")
{
cout<<helpText(lowerCommand);
}

//Exit command
else if(lowerCommand=="exit")
{
return 0;
}
else if(lowerCommand=="chdir")
{
cout<<string(tempCommand[1])<<endl;
chdir(tempCommand[1]);
}

else
cout<<"Can't recognize \'"<<string(tempCommand[0])<<"\' as an internal or external command, or batch script."<<endl;
}
return 0;
}

chdir.cpp:

#include <cstdlib>
#include <string>
#include <unistd.h>

void chdir(std::string path)
{
//Changes the current working directory to path
chdir(path);
}

Как ни странно, использование cout для получения пути к chdir работает отлично. Как это исправить?

-2

Решение

Вы имеете рекурсивное, неопределенное поведение в своем коде. Это переполняет стек.

Попробуйте вставить точку останова в void chdir(std::string path) и посмотрим, что получится.

Вы увидите, что функция chdir называет себя, и, в свою очередь, вызывает себя снова, и снова и … ну, ошибка сегментации.

Также попробуйте посмотреть, что такое «стек вызовов» в отладчике, эта проблема очень заметна.

3

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

Вы должны вызвать основную функцию chdir, используя

::chdir(path.c_str());

или вы просто вызовете свой собственный метод снова.

В unistd.h chdir определяется как:

int chdir(const char *);

Так что вы должны назвать это с const char* аргумент или компилятор будет искать другую функцию с именем «chdir», которая принимает std::string аргумент и использовать это вместо.

2

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