如何使用execvp()

Axl*_*Axl 13 c shell fork execvp

用户将读取一行,我将保留第一个单词作为execvp的命令.

让我们说他会输入"cat file.txt" ...命令将是cat.但我不知道如何使用它execvp(),我读了一些教程,但仍然没有得到它.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *buf;
    char command[32];
    char name[32];
    char *pointer;
    char line[80];
    printf(">");

    while((buf = readline(""))!=NULL){   
        if (strcmp(buf,"exit")==0)
        break;

        if(buf[0]!=NULL)
        add_history(buf);

        pointer = strtok(buf, " ");
        if(pointer != NULL){
            strcpy(command, pointer);
        }

        pid_t pid;

        int  status;

        if ((pid = fork()) < 0) {     
            printf("*** ERROR: forking child process failed\n");
            exit(1);
        }
        else if (pid == 0) {          
            if (execvp(command, buf) < 0) {     
                printf("*** ERROR: exec failed\n");
                exit(1);
            }
        }
        else                                  
        while (wait(&status) != pid)       
            ;
        free(buf);
        printf(">");
    }///end While
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ner 32

第一个参数是您要执行的文件,第二个参数是一个以空字符结尾的字符串数组,表示手册页中指定的文件的相应参数.

例如:

char *cmd = "ls";
char *argv[3];
argv[0] = "ls";
argv[1] = "-la";
argv[2] = NULL;

execvp(cmd, argv); //This will run "ls -la" as if it were a command
Run Code Online (Sandbox Code Playgroud)

  • 这段代码有点工作,但我如何让 *argv 在 cmd 之后包含该行的其余部分?让我们说我把它分成这样的标记:pointer = strtok(buf, " "); 如果(指针!= NULL){ strcpy(命令,指针);} 指针 = strtok(NULL, " "); 如果(指针!= NULL){ strcpy(名称,指针);我可以做 char*argv[3] = {name,"\0"};execvp(command, name); ? (2认同)
  • @Axl我想我现在知道了-我想您正在尝试制作一个外壳?只需编写一个将字符串作为用户输入之后就拆分字符串的函数。因此,如果用户输入“ ls -la”,则编写一个函数,以该函数将其按空格分割,然后将cmd = split [0],argv [0] = split [0],argv [1] = split设置为[2]和argv [3] = NULL适当。有帮助吗? (2认同)