如何将一个来自客户端的字符串解析为exec()?

问题描述 投票:0回答:1

我有一个基于管道的客户端和服务器的通信,我读取用户的输入,然后写入管道,将用户输入的内容发送到服务器。然后在服务器上,我有这个。

int main(int argc, char * argv[]){

    int fd;

    if((fd = open("fifo", O_RDONLY)) < 0){
        perror("open");
        exit(1);
    }

    char buf[100];  
    int bytes_read = 0;

    while((bytes_read = read(fd, buf, 100)) > 0){
        execute_command(buf);
        }
    }
    return 0;
}

所以现在我在buf数组里有了用户发送的命令 然后我调用execute_command函数,它的代码如下:

void execute_command(String command){
     int status;
     pid_t pid;
     char** argv = split(command);

     if( !(pid = fork()) ){
        execlp(argv[0],argv[0],argv + 1);
        _exit(-1);
     }
     else
         wait(NULL);
     }
}

static char** split(char* command){
    int i = 0;
    char** argv = malloc(sizeof(char*) * 100);

    char* c = strtok(command, " ");
    while( c ){
        c = strtok(NULL," "); 
        argv[i++] = strdup(c); 
    }
    argv[i] = 0;

    return argv;
}

当运行这个函数时,每当我从客户端发送一些东西时,我就会收到 "Segmentation fault (core dumped) on the server side. 我想这是因为我使用了错误的方式来使用char数组和指针... ... 我还在尝试理解C语言中指针的所有东西。另外,通信需要基于Pipes,不能像一些人告诉我的那样使用socket。我唯一能真正改变的是与字符串相关的变量的声明和exec()的类型。

c parsing pipe exec
1个回答
1
投票

问题出在 execlp(argv[0],argv[0],argv + 1);.

execlp 期待一个 列表char * 参数,以 NULL

    execlp("foo", "bar", "baz", NULL);

你(1)通过 char ** 作为最后一个参数,并且(2)没有终止的 NULL 在你的参数列表中。

既然你已经准备了一个参数数组,那么就用 execvp 而不是。

© www.soinside.com 2019 - 2024. All rights reserved.