c - 使用虚拟 shell 时,如何检测用户是否在程序和参数后输入 '&'?

标签 c arrays shell command-line-arguments

我有一个虚拟 shell ,如果用户在末尾输入“&”,我希望它能够运行用户在后台输入的任何程序。但是,我不确定如何检查用户是否在末尾键入“&”。我已经尝试过: 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;
}

最佳答案

大多数 shell 将使用 & 标记(通常意味着“在后台运行”),因此不将其作为参数提供 到程序。

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

真实 shell 通常从 STDIN(或者直接终端)读取,或者可以提供一串命令来执行,例如:sh -c "nohup program &".

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

关于c - 使用虚拟 shell 时,如何检测用户是否在程序和参数后输入 '&'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085153/

相关文章:

使用gcc编译c代码,无需安装mingW/cygwin

c - UART 无法接收 GPS NMEA 语句

linux - 嵌套的 Shell 脚本

linux - 将新行更改为所选行的空格

c++ - 音频-视频加密算法

C编程: allocating memory for char array using malloc in C89

python record.fromarrays错误 "array-shape mismatch in array"

c++ - std::initializer_list 作为 std::array 构造函数

arrays - 将 Excel 范围转换为 VBA 字符串

python - 如何使用python在linux中创建用户