开发Linux命令行实用程序[9]

[入库:2005年9月19日] [更新:2007年3月24日]

本文简介:

  其次,Linux 系统调用基本上是一个函数,它属于操作系统代码的一部分。它本身可以在内核中,也可以在静态或动态链接到内核的设备驱动例程中。因此,当从用户代码调用系统调用时(假定从程序中函数 foo() 调用),实际上是在调用内核中的例程。这就引起所谓的从“用户空间”到“内核空间”的上下文切换,不过这仅供了解之用。就调用方式而言,系统调用与库函数之间没有区别。C 库函数本身不是操作系统代码的一部分。它基本上运行在用户空间中,而它的部分实现可能运行在内核空间中。请参阅下一点。
  
  第三,C 库函数可能有也可能没有相关的底层系统调用。有些函数需要使用系统调用来完成其工作,其它函数则不需要。
  
  没有相关系统调用的库函数的一个示例是 string.h 中声明的 strlen() 函数。不需要操作系统功能;该函数的实现只是遍历字符串,并对每个字符增加计数器,直到到达终止该字符串的终止 NULL 字符。请记住,在 C 语言中,字符串只是一个带有终止 NULL 字符(ASCII 0)的字符数组。该函数然后返回计数器的值。这是完全与操作系统无关的代码,并且在所有 C 平台(Linux 或其它)上都以同样的方式工作。
  
  有相关系统调用的库函数的一个示例是 stdio.h 中声明的 fopen() 函数。该函数是打开文件的高层次方式;但是,因为在 Linux 中打开文件的唯一方法是使用 open() 系统调用,所以 fopen() 在其实现中利用 open()。类似地,printf() 和 fprintf() 这样的函数调用 write() 系统调用完成其工作。
  
  结束语
  本文应该给了您足够的预备知识来开始自己编写 Linux 命令行实用程序,但如果您想要进一步学习更多知识的话,请参阅以下参考资料中的建议。
  
  参考资料
  
  下载在本文中提到的源代码:
  selpg.c,selpg 的 C 代码
  showsyserr.c,助手实用程序的 C 代码
  makefile,构建 selpg 的制作文件
  mk,运行制作文件的脚本;在用 chmod +rx mk 使它可执行后只输入 mk
  
  
  请参阅 stdiot 以及本文中使用的所有系统调用和函数的手册页。要学习更多知识,请一定阅读在每个手册页的 SEE ALSO 节描述的其它手册页。
  
  
  请参阅 getopt 的手册页 man 3 getopt。这里的“3”是手册页的节;第 3 节介绍的是 C 库函数。必须给出“3”,因为在手册页第 1 节(命令)中也有一个 getopt,如果您不指定节,则按缺省值显示第 1 节。我在本文对命令行参数进行了手工解析,因为在这个例子中它相对简单,同时也是为了演示技术。然而,对于更复杂的参数解析,您可能希望查看 getopt() 函数。它可以节省您的一些工作。
  
  
  请参阅 assert()、lp、cancel、lpstat、ps 和 kill 的手册页。
  
  
  请参阅 pipe()、dup()、open()、close()、exec() 和 fork() 的手册页。popen() 是使用 pipe()、fork() 和 exec() 实现的。警告:使用 pipe() 比使用 popen() 复杂! 请参考一本介绍使用它的正确方法的好书,如 Marc J. Rochkind 编写的 Advanced Unix Programming(Prentice-Hall, Inc., 1986)。
  
  
  请参阅您所用 shell(bash、csh 或任何一种)的手册页。学习在命令行、在脚本中以及在与您自己的程序的交互中使用 shell 的强大功能。这将极大地提高您软件开发的生产率。
  
  

本文关键:开发Linux命令行实用程序
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top