Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何检测用户是否键入'&';使用虚拟壳时,程序和参数之后?_C_Arrays_Shell_Command Line Arguments - Fatal编程技术网

C 如何检测用户是否键入'&';使用虚拟壳时,程序和参数之后?

C 如何检测用户是否键入'&';使用虚拟壳时,程序和参数之后?,c,arrays,shell,command-line-arguments,C,Arrays,Shell,Command Line Arguments,我有一个虚拟shell,我希望它能够运行用户在后台输入的任何程序,如果用户在末尾键入“&”。但是,我不知道如何检查用户是否在末尾键入了“&”。我已经试过了:printf(“%c\n”,args[ARRAY\u SIZE-1]),但似乎什么都没打印出来。我这样做是为了看看是否可以访问“&”。我该怎么做呢 我使用的代码如下: #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <

我有一个虚拟shell,我希望它能够运行用户在后台输入的任何程序,如果用户在末尾键入“&”。但是,我不知道如何检查用户是否在末尾键入了“&”。我已经试过了:
printf(“%c\n”,args[ARRAY\u 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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小1大多数shell将使用
&
标记(通常表示“在后台运行”),因此不会将其作为参数提供给程序

若要将“&”参数传递给程序,必须禁用特定于shell的解释,例如:
/dummyshell“programtorun”&“
(两个参数)或
/dummyshell”programtorun&“
(一个参数)

真正的shell通常从STDIN读取(或者直接从终端读取),或者可以提供一系列要执行的命令,比如:
sh-c“nohup程序&”


直接读取输入可以避免前面提到的shell解析,并且再次使用引号可以防止命令中的
&
被用于执行(
sh
)命令的shell处理;请注意,在这种情况下,整个要运行的命令集是如何作为单个参数传递的。

大多数shell将使用
&
(通常表示“在后台运行”),因此它不会传递给程序。若要将其传递给程序,必须禁用特定于shell的解释,例如:
/program”&“
如果未传递给程序,我将如何更改代码,使其具有在后台运行程序的选项?让shell在后台运行程序。程序通常不需要做任何事情。现在,如果需求/任务是“如何检测流程何时在后台运行”,那么可以问这个问题(作为另一个问题)。X是X,不是Y@user2864740,你是说我的虚拟shell已经能够在后台运行程序了吗?因为看起来不是这样。每当我在末尾加上一个“&”,虚拟shell就会在前台运行程序。如果它在后台运行程序,dummyshell的提示应该立即出现,对吗?不,请看我的答案。虚拟shell必须执行shell所执行的任何操作(或它想要执行的任何操作)。我的意思是,
&
——由包含的shell解析/处理——独立于程序。我不确定您的具体建议。我只想知道如何更改我的虚拟shell,以便当用户在末尾键入“&”时,它可以在后台运行程序。我不想将“&”参数传递给用户输入的程序。@user2264035“如何检测用户在使用虚拟shell时是否在程序和参数后键入“&”要“更改”dummyshell,首先必须将
&
转换为字符串(见上文),然后必须解析相应的一个或多个参数(见上文;这样它就可以理解
&
)然后你必须使用
守护进程
(或者用fork/fork/close/etc模拟它)。我的印象是,我必须检测用户是否键入“&”我是否希望虚拟shell在后台运行用户的程序。不是这样吗?@user2264035 see