上一节介绍了 linux 中的文件类型,并在文章最后使用 C语言编写了程序,该程序能够接受一个文件名参数,并打印出该文件的类型。不知道大家如何,反正我当初学编程时,发现(编译后的)可执行程序居然也能像(编写代码阶段的)函数一样接收参数,觉得太神奇了。

C语言小白疑问:编译好的可执行程序,也能像函数一样接收参数?

小编刚学习 C语言时,是在 windows 中学习的,编译出的程序都是双击执行,从来没想过编译后的可执行程序还能接收参数。可执行程序怎样接收参数的呢?

事实上,不仅仅是上一节的C语言程序能够接受参数,linux 中的大部分 shell 命令都是可以接收参数的,例如 ls 命令可以接收 -l 参数,输出更加详细的文件信息:

# ls -ltotal 24-rwxr-xr-x 1 root root 13205 Dec 22 18:26 a.out-rw-r--r-- 1 root root 427 Dec 21 21:01 main.c-rw-r--r-- 1 root root 1653 Dec 22 18:26 test.c
C语言小白疑问:编译好的可执行程序,也能像函数一样接收参数?

执行删除命令 rm 也需要指定文件名:

# rm a.out

ls 和 rm 本质上也是 linux 中的可执行程序,linux 中的大部分程序都是由 C语言编写的。C语言程序总是有个入口函数(常常是 main 函数),入口函数的原型如下:

int main(int argc, char* argv[]);

其中 argc 是命令参数的数目,argv 则是指向参数的各个指针构成的数组。在 shell 中输入命令(其实就是可执行程序)后,shell 会调用 exec 函数族执行该命令。输入 man 命令查询 exec 函数族的手册:

C语言小白疑问:编译好的可执行程序,也能像函数一样接收参数?

容易看出,exec 函数族在创建新进程执行命令时,允许传入若干参数给命令。

这就明白了,shell 也是一个进程,它会记录用户输入的命令和命令参数,在调用 exec 函数族执行命令时,把记录的参数传递给命令。C语言模拟 shell 传递参数给可执行程序

知道了 linux 中可执行程序接收参数的原理后,编写程序模拟 shell 传递参数就不难了。我们先编写一个能够接受参数的C语言程序:

#include <stdio.h>int main(int argc, char* argv[]){ int i = 0; printf("n"); for(i=0; i<argc; i++) printf("t%sn
查看原文 >>
相关文章