如何让我的虚拟shell在后台运行程序?

时间:2013-11-19 03:58:00

标签: c shell background fork wait

我希望用户能够输入和输入程序及其参数,但如果用户键入“&”最后,dummyshell应该在后台运行程序。在这种情况下,dummyshell将立即向用户返回提示(用于进一步的命令输入)。我知道我必须使用wait()但是我不知道如何使用它来在后台运行程序。

例如,当程序在前台运行时:

$ dummyshell
> HelloWorld
...
> 

例如程序在后台运行时:

$ dummyshell
> HelloWorld &
> 

这是我到目前为止使用的代码:

#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 个答案:

没有答案