我有一个虚拟外壳,我希望它能够运行用户在后台输入的任何程序,如果用户键入'&'在末尾。但是,我不确定如何检查用户是否输入'&'在末尾。我已经尝试过:printf("%c\n", args[ARRAY_SIZE-1])
但似乎没有打印任何内容。我这样做是为了看看我是否可以访问'&'。我怎么能这样做呢?
我正在使用的代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define BUFFER_SIZE 1<<16
#define ARRAY_SIZE 1<<16
static void parseCmdArgs(char *buffer, char** cmdArgs,
size_t cmdArgsSize, size_t *nargs)
{
char *bufCmdArgs[cmdArgsSize];
char **temp;
char *buf;
size_t n, p;
cmdArgs[0] = buf = bufCmdArgs[0] = buffer;
for(temp=bufCmdArgs; (*temp=strsep(&buf, " \n\t")) != NULL ;){
if ((*temp != '\0') && (++temp >= &bufCmdArgs[cmdArgsSize]))
break;
}
for (p=n=0; bufCmdArgs[n]!=NULL; n++){
if(strlen(bufCmdArgs[n])>0)
cmdArgs[p++]=bufCmdArgs[n];
}
*nargs=p;
cmdArgs[p]=NULL;
}
//int main(int argc, char *argv[], char *envp[]){
int main(void)
{
char buffer[BUFFER_SIZE];
char *args[ARRAY_SIZE];
int retStatus;
size_t nargs;
pid_t pid;
while(1){
printf("$dummyshell ");
fgets(buffer, BUFFER_SIZE, stdin);
parseCmdArgs(buffer, args, ARRAY_SIZE, &nargs);
if (nargs==0)
continue;
if (!strcmp(args[0], "help"))
{
printf("cat cd (absolute path references only\n");
printf("exit\n");
printf("help history\n");
printf("jobs kill\n");
printf("ls more\n");
printf("ps pwd\n");
continue;
}
if (!strcmp(args[0], "exit" ))
exit(0);
pid = fork();
if (pid){
pid = wait(&retStatus);
}
else {
if( execvp(args[0], args)) {
fprintf(stderr, "%s\n", strerror(errno));
exit(127);
}
}
}
return 0;
}
答案 0 :(得分:0)
大多数shell将消费 &
令牌(通常用于表示&#34;在后台运行&#34;)因此它不作为参与该计划的。
传递&#34;&amp;&#34;程序的参数,必须禁用特定于shell的解释,例如:./dummyshell "programtorun" "&"
(两个参数)或./dummyshell "programtorun &"
(一个参数)。
Real shell通常从STDIN(或者可能是直接终端)读取,或者可以提供一串要执行的命令,例如:sh -c "nohup program &"
。
直接读取输入避免了前面提到的shell解析,并再次使用引号保护命令中的&
不被用于执行(sh
)命令的shell处理;请注意在这种情况下如何将整个运行命令作为单个参数传递。