我正在将批处理模拟器编写为个人项目。我试图使用unistd.h中的chdir()来实现cd命令。但是,使用它会导致段错误。
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的路径非常合适。我该如何解决这个问题?
答案 0 :(得分:3)
您的代码中存在递归,未终止的行为。这会溢出堆栈。
尝试在void chdir(std::string path)
中插入断点,看看会发生什么。
您会看到函数chdir
调用自身,然后再次调用自身,并再次......好吧,分段错误。
另外,尝试查看调试器中的“调用堆栈”,这个问题在那里非常明显。
答案 1 :(得分:2)
您应该使用
调用底层的chdir函数::chdir(path.c_str());
或者您只需再次调用自己的方法。
在unistd.h中,chdir定义为:
int chdir(const char *);
所以你必须使用const char*
参数调用它,否则编译器将搜索另一个名为“chdir”的函数,它接受一个std::string
参数并使用它。