Arrays execvp不适用于strtok中的char

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,

我正在编写一个函数来模拟命令的shell管道

我正在使用strtok(lines,“|”)将第一个命令和第二个命令分开,将它们复制到char*数组[]

但是,当我使用strtok中的这些字符时,当使用
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”
会给您一个有用的线索。此外,尽管从技术上讲,忽略函数调用失败的检查是可选的,但在大多数情况下,忽略此类检查是非常糟糕的。我希望在这种特殊情况下,适当的故障检查和相关的报告也会给您一个关于发生了什么的线索。