C 处理像ls-l/somedir这样的命令

C 处理像ls-l/somedir这样的命令,c,unix,C,Unix,到目前为止,我的代码在用户键入时处理ls命令。我希望能够处理像ls-l/tmp这样的命令。 我的代码到目前为止 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <stdarg.h> #include <sys/types.h> int ma

到目前为止,我的代码在用户键入时处理
ls
命令。我希望能够处理像
ls-l/tmp
这样的命令。 我的代码到目前为止

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdarg.h>
#include <sys/types.h>


int main(void)
{
for(;;){
char str[500];
printf("Type a command : \n");
scanf("%s",str);
char *path;
  path = getenv("PATH");
    char *argv[] = { path ,NULL};

    int status;
    int pid = fork();

        if ( pid == 0 ) {
printf("executing==============> %s \n",str);
          execvp(str,argv);
}
wait(&status);
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
对于(;;){
char-str[500];
printf(“键入命令:\n”);
scanf(“%s”,str);
字符*路径;
path=getenv(“path”);
char*argv[]={path,NULL};
智力状态;
int-pid=fork();
如果(pid==0){
printf(“正在执行==============>%s\n”,str);
execvp(str,argv);
}
等待(&状态);
}
}

有什么想法吗?我必须在没有
system()

的情况下执行
execvp
系统调用,系统调用的参数应该是一个包含命令的字符串和一个字符串数组,从命令开始,然后是它的参数,一个接一个,最后是一个空字符串

在您的情况下,它将是:

char *argv[] = {"ls", "-l", "/tmp", NULL};
请记住,这段代码只是对幕后情况的说明。您需要根据用户的输入构造
argv[]


您可以组合使用
strchr()
来标记输入(查找空格),然后使用
sscanf
读取字符串的一部分。然后,您必须将输入指针更新到由
strchr()
+1返回的值,并使用
sscanf()
读取命令的下一部分。

您可以轻松地使用

它分叉,调用
execl(“/bin/sh”,“sh”。-c”,命令,(char*)0并在命令完成后返回

在调用shell时,它还支持shell的内置功能。

使用“系统”功能进行相同的调用。 系统(str)可能会工作。 此函数创建一个单独的线程,执行提供给它的命令。 有关详细信息,请参见“人工系统”。

这对我来说很有效:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdarg.h>
#include <sys/types.h>
#define MAX_NAME_SZ 256

int main(void)
{
char *str,*ret, *pa1, *pa2, *dtm ,*pa3;
str=(char *)malloc(50*sizeof(char));
ret=(char *)malloc(50*sizeof(char));
pa1=(char *)malloc(50*sizeof(char));
pa2=(char *)malloc(50*sizeof(char));
dtm=(char *)malloc(50*sizeof(char));
pa3=(char *)malloc(50*sizeof(char));
char ch =' ' ;
printf("Type a command : \n");

    fgets (str, MAX_NAME_SZ, stdin);

    if ((strlen(str)>0) && (str[strlen (str) - 1] == '\n'))
        str[strlen (str) - 1] = '\0';
    ret = strchr(str, ch);

    if (ret !=NULL)
    {
        strcpy( dtm, str );
        sscanf( dtm, "%s %s %s  ", pa1, pa2,pa3  );
        }

    char *path;
     path = getenv("PATH");

    int status=2;
    int pid = fork();

    if ( pid == 0 ) {
        if (ret !=NULL){
          char *argv[] = { path ,pa2, pa3 ,NULL};
              execvp(pa1,argv);

                }
        else {
          char *argv[] = { path ,NULL};
          execvp(str,argv);

        }
    }
    wait(&status);

    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_NAME_SZ 256
内部主(空)
{
字符*str、*ret、*pa1、*pa2、*dtm、*pa3;
str=(char*)malloc(50*sizeof(char));
ret=(char*)malloc(50*sizeof(char));
pa1=(char*)malloc(50*sizeof(char));
pa2=(char*)malloc(50*sizeof(char));
dtm=(char*)malloc(50*sizeof(char));
pa3=(char*)malloc(50*sizeof(char));
char ch=“”;
printf(“键入命令:\n”);
fgets(str、MAX_NAME_SZ、stdin);
如果((strlen(str)>0)和&(str[strlen(str)-1]=='\n'))
str[strlen(str)-1]='\0';
ret=strchr(str,ch);
如果(ret!=NULL)
{
strcpy(dtm,str);
sscanf(dtm,“%s%s%s”,pa1、pa2、pa3);
}
字符*路径;
path=getenv(“path”);
int状态=2;
int-pid=fork();
如果(pid==0){
如果(ret!=NULL){
char*argv[]={path,pa2,pa3,NULL};
执行副总裁(pa1,argv);
}
否则{
char*argv[]={path,NULL};
execvp(str,argv);
}
}
等待(&状态);
}

首先,您应该使用
scanf(“%s”,str)取而代之。您的代码之所以有效,是因为在本例中,
str
&str
具有相同的地址。调用
execvp
时,需要将要运行的命令和字符串数组作为参数传递,每个字符串都是该命令的一个参数。注意:按照惯例,使用所需的命令启动阵列。e、 g.
char*argv[]={str,“-l”,“/tmp”,NULL}现在是
char*argv[]={str,“-l”,“/tmp”,NULL}当我键入
ls
时,它直接执行
ls-l/tmp
direct。我想要的是能够处理像
ls
pwd
这样的命令和像
ls-l/somedir
@LuizEduardoF这样的命令。请参见下面的答案。记住,当按空格拆分字符串时,您需要处理像
ls-l/some/dir/name\with\spaces
这样的情况,为什么不直接调用
系统(str)
?我必须在没有
system()
的情况下执行此操作。使用
system(command)
会导致程序在执行
命令时停止并等待。使用
fork()
执行此操作允许您的进程创建一个子进程,并使用子进程PID为您运行另一个程序,因此如果主程序想执行其他操作,则不必等待子进程退出。此外,您还应该考虑<代码> ExcVP()<代码>系统调用的影响。我必须在没有<代码>系统()/<代码>的情况下进行。