Arrays execvp不适用于strtok中的char
我正在编写一个函数来模拟命令的shell管道 我正在使用strtok(lines,“|”)将第一个命令和第二个命令分开,将它们复制到char*数组[] 但是,当我使用strtok中的这些字符时,当使用Arrays execvp不适用于strtok中的char,arrays,c,char,execvp,Arrays,C,Char,Execvp,我正在编写一个函数来模拟命令的shell管道 我正在使用strtok(lines,“|”)将第一个命令和第二个命令分开,将它们复制到char*数组[] 但是,当我使用strtok中的这些字符时,当使用execvp时不会发生任何事情,但是当正常定义它们时,execvp起作用 token1[0]="whoami"; token2[0]="date"; 以下是代码片段: int main() { char lines[20]; fgets(lines,
execvp
时不会发生任何事情,但是当正常定义它们时,execvp
起作用
token1[0]="whoami";
token2[0]="date";
以下是代码片段:
int main() {
char lines[20];
fgets(lines, sizeof(lines)/sizeof(lines[0]), stdin);
if (strchr(lines, '|') != NULL)
{
printf("pipe is there\n");
}
else
{
printf("no piping");
}
char *token1[2];
token1[0] = strtok(lines, "|");
token1[1]= NULL;
printf( "%s\n", token1[0] );
char *token2[2];
token2[0] = strtok(NULL, " ");
printf( "%s\n", token2[0] );
token2[1]= NULL;
execvp(token1[0], token1);
execvp(token2[0], token2);
}
标记值显示正确,但执行VP不执行任何操作
但是,当我手动定义令牌值时,execvp
起作用
token1[0]="whoami";
token2[0]="date";
返回:
ubuntu
2021年5月22日星期六13:15:55 UTC
我不知道这是为什么?execvp()如果成功,则不会返回。你可以在手册里读到
man execve
您为演示的程序提供的确切输入是什么?我打赌它不是whoami | date,但如果是,您将获得与硬编码值相同的输出。另外,我希望将printf
格式更改为“'%s'\n”
会给您一个有用的线索。此外,尽管从技术上讲,忽略函数调用失败的检查是可选的,但在大多数情况下,忽略此类检查是非常糟糕的。我希望在这种特殊情况下,适当的故障检查和相关的报告也会给您一个关于发生了什么的线索。