gpt4 book ai didi

c++ - 如何在命令后保持我的 shell 运行

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:40 24 4
gpt4 key购买 nike

我正在另一个 shell 中运行这个基本的 shell 程序。我无法弄清楚为什么在“ls”执行后我的 shell 不继续运行。我没有导出,但它会回到原来的外壳。如果想使用它,我每次都必须运行我的 shell 程序。我想这就是 fork() 应该做的。我只希望我的 shell 使用我用 if else 语句编码的 exit 命令退出。任何建议将不胜感激。哦,请忽略 gettoks() 解析器函数,我不知道如何将它用于输入,所以我为字符串输入 cmSTR 编写了 if else 语句,而不是使用 gettoks() 解析器。主要是因为我不知道如何将输入传递给它

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <cstdlib>
#include <sys/wait.h>

using namespace std;
// Initializing counters for trapping
static int cc_counter = 0;
static int cz_counter = 0;
static int cq_counter = 0;
//Functions for trap signal handler
void cc_handler( int signo )
{
++cc_counter;
}
void cz_handler( int signo )
{
++cz_counter;
}
void cq_handler( int signo )
{
++cq_counter;
}

//*********************************************************
//
// Extern Declarations
//
//*********************************************************
using namespace std;
extern "C"
{
extern char **gettoks();
}


//*********************************************************
//
// Main Function
//
//*********************************************************
int main( int argc, char *argv[] )
{
// local variables
int ii;
char **toks;
int retval;

// initialize local variables
ii = 0;
toks = NULL;
retval = 0;
char buf[1000];//Initialize of size for current working directory
string cmSTR;//String to hold input
int status;//Initialization of status for fork()
pid_t pid;//Declaration of pid

// main (infinite) loop
while( true )
{
signal( SIGINT, cc_handler );// Traps Ctrl+C
signal( SIGTSTP, cz_handler);// Traps Ctrl+Z
signal( SIGQUIT, cq_handler);// Traps Ctrl+\
//prompt and show current working directory
cout <<("RS_SHELL:") << getcwd(buf,1000) << "\t";
getline(cin ,cmSTR);//read input from keyboard
// if else loop to switch based on command input
if(cmSTR == "ls")// if ls, then execute arguement
{
execl( "/bin/ls", "ls", NULL );//System call to execute ls

}
else if(cmSTR == "exit")//if exit, then execute block of code
{
cout << "Ctrl C entered: " << ++cc_counter << "times"<< endl;
cout << "Ctrl Z entered: " << ++cz_counter << "times"<< endl;
cout << "Ctrl Back Slash entered: " << ++cq_counter << "times"<< endl;
exit(1);
}
else if(cmSTR == "guish")// if guish, execute guish shell
{
execvp("guish", NULL);
}
//if input is not any of previous commands then fork()
else if(cmSTR != "ls" && cmSTR != "exit" && cmSTR != "guish" && cmSTR != "\n")
{
pid = fork();
if (pid < 0)//Loop to fork parent and child process
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0)//Child process
{
execvp("guish", NULL);//system call to execute guish shell

}
else //Parent process
{
waitpid( -1, &status,0);
exit(0);
}
}




// get arguments
toks = gettoks();

if( toks[0] != NULL )
{
// simple loop to echo all arguments
for( ii=0; toks[ii] != NULL; ii++ )
{
cout << "Argument " << ii << ": " << toks[ii] << endl;
}

if( !strcmp( toks[0], "exit" ))
break;
}
}

// return to calling environment
return( retval );
}

最佳答案

如您所料,execl 及其相关函数用新进程覆盖了当前进程。因此,在启动 lsexecl 调用之后,您的程序将不再存在以继续运行。

如果你想让你的 shell 程序在运行 ls 之后继续存在,你需要 fork() before 调用 execl( "/bin/ls", "ls", NULL );.

此外,如果您希望 ls 的输出出现在与您的 shell 相同的控制台中,正如我认为您可能想要的那样,您将需要通过管道传输 ls< 的输出 返回到您的 shell,然后将该输出写入您的 shell 的控制台。参见 Writing my own shell… stuck on pipes? ,例如。

关于c++ - 如何在命令后保持我的 shell 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15238853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com