shell中C程序的调用
在报告中,有一个问题如下: 根据调用程序时使用的名称,编写一个程序,将大写字母转换为小写字母,反之亦然 在给出的解决方案中,它表示当调用名为shell中C程序的调用,c,C,在报告中,有一个问题如下: 根据调用程序时使用的名称,编写一个程序,将大写字母转换为小写字母,反之亦然 在给出的解决方案中,它表示当调用名为lower的程序时,程序将lower转换为upper。在解决方案中,argv[0]与“lower”相比较,但在Linux上,argv[0]将是“/lower”,而不是“lower” 有人能澄清一下吗?考虑一下这个测试代码: #include <stdio.h> int main(int argc, char** argv) { printf(
lower
的程序时,程序将lower
转换为upper
。在解决方案中,argv[0]
与“lower”
相比较,但在Linux上,argv[0]
将是“/lower”
,而不是“lower”
有人能澄清一下吗?考虑一下这个测试代码:
#include <stdio.h>
int main(int argc, char** argv) {
printf("ARGV[0] = %s\n", argv[0]);
}
因此,您希望根据正则表达式或子字符串测试字符串。Shell如何执行您的程序?(下面是非常简单的解释) 这意味着加载程序的所有参数都是由shell和 调用加载器,默认情况下,argv[0]与程序的路径名/文件名相同 现在说./a.out..表示程序的绝对路径名为./a.out。(当前目录中的文件a.out) 我们可以省略吗?答案是肯定的,如果环境变量路径有。正如它的一个组成部分所说的第一个组成部分 您可以通过在shell提示符中键入echo$PATH来查看PATH变量的内容。(A:将显示单独的路径列表) 如果。您可以通过在shell提示符中键入export PATH=.:$PATH来添加它 在此之后,您可以通过键入a.out从当前目录运行代码,而无需键入。/a.out 现在我想这很清楚了,为什么argv[0]会成为您正在执行的文件名 现在我们可以为argv[0]使用不同的名称而不是文件名了吗 答案是肯定的,然后您需要自己调用加载程序,即编写一小段行为类似于shell的代码
您可以在internet/手册页上浏览execve函数系列,它实际上就是此处提到的加载程序。然后使用
argv[1]
。问题是什么?我认为在他们的情况下,他们不使用./因为他们在使用可执行文件时将shell设置为使用当前目录作为相对路径。例如,这类似于只键入ls而不键入/usr/bin/ls。在您的情况下,/指定要在当前目录中使用lower。“.”表示*nix系统中的当前工作目录。@uDaY:K&R或“C编程语言”被认为是C编程的资源和书籍。@Linuxios,噢,谢谢!)@乌代:当然。现在您知道了当您需要C上的权威引用时要查找什么。如果您将可执行文件放在~/bin/或路径上的其他地方,它将运行可执行文件。您还可以使用path=。test_argv
仅为单个命令设置路径。
% ./test_argv
ARGV[0] = ./test_argv
% test_argv
ARGV[0] = test_argv
% /tmp/test_argv
ARGV[0] = /tmp/test_argv
shell()
{
loader("Path name/Filename of your program", argv[0], argv[1]...for your program);
}