【问题标题】:How to execute a program from command line in a shell written in C如何在用 C 编写的 shell 中从命令行执行程序
【发布时间】:2021-01-11 04:53:12
【问题描述】:

我在 C 编程中创建了一个小 shell,如果命令启动,它会执行以下操作 启动程序[额外参数] “程序”是要执行的程序。参数以“/”开头(如 /usr/bin/xterm,应将其解释为完整路径。否则,其路径从当前目录开始。

它可以有可选的“参数”。它使用 fork() + exec() 以相应的参数启动程序,并等待直到程序终止(使用 waitpid() 调用)。 例如

 **start /usr/bin/xterm –bg green**

会调出一个绿色背景的终端。在终端关闭之前不会返回提示。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>

// max # args
#define MAX_ARGS 64
// token sparators
#define SEPARATORS " \t\n"

int main (int argc, char ** argv)
{
    char buf[1024];
    char * args[MAX_ARGS];
    char ** arg;
    char *** arguments = malloc(3 * sizeof(char**));
    __pid_t pid;
    int status;
    
    while (1)
    {
        printf("#");
        if (fgets (buf, 1024, stdin ))
        {
            
            arg = args;
            *arg++ = strtok(buf, SEPARATORS);  // tokenize input
            while ((*arg++ = strtok(NULL, SEPARATORS)));
            if (args[0])
            {
                //#byebye command, exist the while loop.
                if (!strcmp(args[0], "byebye")) {
                    break;
                } 
                
                if (!strcmp(args[0], "whereami")) {
                          // arg string input from user matches whereami
                          char cwd[1024];
                          chdir("/path/to/change/directory/to");
                           getcwd(cwd, sizeof(cwd));
                            printf("%s\n", cwd);   
                             continue;
                  }

                   if (!strcmp(args[0], "start")) {
                       if (args[1]) 
                        {
                            arguments[0] = malloc(16 * sizeof(char*));
                             int argument_num = 2;
                              while (args[argument_num]) {
                                          // grab all the parameters
                                          arguments[0][argument_num - 2] = malloc(strlen(args[argument_num]) * sizeof(char));
                                       strcpy(arguments[0][argument_num - 2], args[argument_num]);
                                    argument_num++;
                               }

                           arguments[0][argument_num] = NULL;

                             if (0 == (pid = fork())) {
                                  // child process
                                 if (-1 == execve(args[1], (char **)arguments[0], NULL)) {
                                        fprintf(stdout, "child process execve failed [%m]\n");
                                        break;
                                     }
                               }
                             // wait for child
                             while (0 == waitpid(pid, &status, WNOHANG)) {}
                                                                                  
                              free(arguments[0]);
                          }

                                 continue;
                       }

     
  
                arg = args;
                while (*arg) fprintf(stdout, "%s ", *arg++);
                fputs ("\n", stdout);
            }
        }
    }
    return 0;
} 

由于某种原因,当我测试代码时,它说找不到文件或目录

【问题讨论】:

  • 这是调试器可以提供帮助的地方。
  • 将前两个参数输出到您的execve 调用中,并将结果添加到您的问题中。

标签: c fork


【解决方案1】:

代码运行良好。如果您得到start /usr/bin/xterm –bg greendirectory not found,则可能是因为/usr/bin/xterm 不存在。你在 Mac 上?

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2011-08-23
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多