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

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

可执行程序怎样接收参数的呢?

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

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

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

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

容易看出,exec 函数族在创建新进程执行命令时,允许传入若干参数给命令。这就明白了,shell 也是一个进程,它会记录用户输入的命令和命令参数,在调用 exec 函数族执行命令时,把记录的参数传递给命令。

C语言模拟 shell 传递参数给可执行程序

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

程序很简单,就是将接收到的参数打印出来。编译并执行之,得到如下结果:

因为规定所有有效参数之后 argv 指向 NULL,所以遍历 C语言程序接收到的所有参数时,上面的 for 循环也可以写成:for(i=0; NULL!=argv[i]; i++)。

现在再编写一个程序,在这个程序中,我们将使用 exec 函数族模拟 shell 执行由 t.c 编译而来的可执行程序 a.out,并向其传送指定的参数。

代码很简单,将“hello”和“embedTime”两个参数填入 argv 里,再调用 execvp 函数模拟 shell 执行 a.out 程序,编译执行:

模拟 shell 的 sim.out 程序的确成功把上面两个参数传递给 a.out 了,但是 sim.out 程序最后的 “sim shell exit.”信息却没有输出。这是因为 sim.out 进程被 a.out 进程替代了。

编写完美模拟 shell 的C语言程序

这样模拟 shell 并不完美,总不至于为了执行一个进程,shell 都得退出吧?还记得第 11 节介绍的多进程 C语言程序编写方法吗?为了完美模拟 shell,可以 fork 出一个子进程,在子进程中执行 a.out ,请看如下代码:

现在再编译执行,发现我们不仅成功模拟了 shell 执行 a.out ,而且 a.out 执行时,sim.out 也没有被替换,终于较为完美的模拟了 shell 传递参数给可执行程序。

linux怎么用两个进程传值,linux下的C开发14,可执行程序如何传递参数?模拟shell执行命令...相关推荐

  1. linux怎么用两个进程传值,关于linux:将变量脚本参数传递给另一个脚本,然后将qsub传递给程序...

    在阅读了大量的bash脚本线程和帮助站点之后,我找不到一个有效的解决方案. 我想把一个变量参数'i'从一个脚本传递到另一个脚本$i,然后qsub它到一个程序"$1".在程序中,我从 ...

  2. layui两个html传值,Layui(二级页面) 弹出层打开页面|传递参数

    一级弹出层:弹出打开页面 layer.open({ type: 2, title: '添加用户', content: '../user/goAdd', area: ['460px', '450px'] ...

  3. 通知模式实现两个textField传值及模态视图——iOS开发

    通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...

  4. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  5. linux大型网络游戏,两款大型的Linux下的网络游戏

    两款大型的Linux下的网络游戏 发布时间:2007-07-12 15:45:36来源:红联作者:rformance <永恒大陆>是一款正在开发中的免费网游,该游戏实际上已经可玩,但开发商 ...

  6. linux xargs 给命令传递参数 组合多个命令

    简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的 find /sbin -perm +700 |ls ...

  7. linux shell java 参数_java调用linux中的shell脚本传递参数并返回执行结果

    [刚接触 linux下的开发,最近遇到java调用shell脚本的问题,找到一个比较适合菜鸟级的方法,转述如下: 在需要运行的SHELL脚本第一行添加 #!/bin/sh然后在终端运行  chmod ...

  8. linux删除位于后台的进程组,linux命令(12)-进程与作业管理

    (1)at 在指定时间完成任务 root可以使用这个命令,对于其他用户来说,能否可以使用就取决于两个文件:/etc/at.allow和/etc/at.deny,可以使用是将"用户名" ...

  9. linux查看3306是哪个进程占用,linux查看端口占用

    发表于 2019-08-18 21:00:36 by 月小升 一. 例子 lsof -i:7000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...

最新文章

  1. 实践教程 | TensorRT部署深度学习模型
  2. skype安卓手机版_危险的战争游戏安卓手机版下载-危险的战争下载v1.0.13
  3. vs2013配置opencv2.4.9
  4. 定理在数学中的简写形式_西方把勾股定理叫毕达哥拉斯定理,我们的教材上是不是该改改名?...
  5. hive 集成hbase 笔记
  6. 35个非主流开源数据库
  7. 〈转〉用VS2005.NET进行三层结构应用程序的开发
  8. 网易数帆Curve加入PolarDB开源数据库社区
  9. 多功能的图像超分辨模型:用于盲图像超分辨的非对称卷积神经网络
  10. 一首歌是怎么诞生的?
  11. 联想哪款服务器性能,联想深腾7000高性能服务器
  12. BoundsChecker 使用
  13. 第七章:Java基础数据类型-整数类型
  14. 在Windows平台上如何安装Python
  15. 从ICML 2022看域泛化(Domain Generalization)最新进展
  16. 女孩子有什么颜值高的蓝牙耳机推荐?双12五款高音质游戏蓝牙耳机分享
  17. QQ号转换成16进制登陆
  18. 不等式$\sum x_i^3(1-x_i)\leq\frac{1}{8}$
  19. VFS基础学习笔记 - 5.读文件过程
  20. 孙鑫VC++LESSON2:掌握C++基本语法

热门文章

  1. SOC/LM在台湾的2011年发展趋势研判
  2. [Apache] Apache 從 2.2 換至 2.4 httpd.conf 的調整筆記 (windows 環境)
  3. ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
  4. Java编程中“为了性能”需做的26件事
  5. lamp安装指南(转)
  6. 《敏捷软件开发》学习笔记 第20章
  7. Java Jdbc减少交互提升批量处理性能,到底该如何优化才好?
  8. 快速获取本机IP地址AWK功能
  9. SAP-PM 的工具管理篇
  10. IAAS、SAAS、PAAS