我有一个基于管道的客户端和服务器的通信,我读取用户的输入,然后写入管道,将用户输入的内容发送到服务器。然后在服务器上,我有这个。
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()的类型。
问题出在 execlp(argv[0],argv[0],argv + 1);
.
execlp
期待一个 列表 的 char *
参数,以 NULL
如
execlp("foo", "bar", "baz", NULL);
你(1)通过 char **
作为最后一个参数,并且(2)没有终止的 NULL
在你的参数列表中。
既然你已经准备了一个参数数组,那么就用 execvp
而不是。