繁体   English   中英

C中的Execv函数不读取作为参数传入的变量

[英]Execv function in C not reading a variable that is passed in as an argument

所以我正在构建我自己的 shell,我想要的命令之一是“cat”函数。 为此,我使用 execv 函数并传入“cat”的正确 bin 路径以及我想要连接并打印到终端的文件名。

下面的代码工作得很好,但我在我想要“cat”的文件名中进行了硬编码

void cat(char *fileName)
{
    char *bin_path = "/bin/cat";
    printf("%d\n", strncmp(fileName, "junk.txt", strlen("junk.txt"))); // returns 0, meaning equal values
    char *args[] = {bin_path, "junk.txt", NULL};
    execv(bin_path, args);
}

上面的输出如下所示参数被硬编码在

但是我希望能够使这个函数动态化并将文件名传递给函数,所以这就是我将变量 fileName 作为参数的原因。 您可以看到我将字符串文字“junk.txt”与 fileName 变量进行比较,它返回 0,这意味着它们相等! 但是当我将变量 fileName 传递给 execv 函数时,它不起作用。 请在下面查看我损坏的代码

void cat(char *fileName)
{
    char *bin_path = "/bin/cat";
    printf("%d\n", strncmp(fileName, "junk.txt", strlen("junk.txt"))); // returns 0, meaning equal values
    char *args[] = {bin_path, fileName, NULL};
    execv(bin_path, args);
}

没有与该名称匹配的文件或目录

任何人都知道这是为什么?

可能您将文件名作为整行读取并在行尾获得换行符。 strncmp只比较你告诉它的字符数,所以零结果不能证明字符串是相等的。 我们甚至可以在cat的错误消息中看到换行符:在“junk.txt”之后,它的“:”在一个新行上。

更改调用例程以从名称中删除不需要的换行符。

将来,始终提供带有调试问题的最小可重现示例 在这种情况下,错误出现在您没有显示的代码中,在调用例程中,这就是为什么应该始终提供 MRE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM