操作系统热线电话

C程序无论做什么事都要靠操作系统。如果它想与硬件打交道,就要进行系统调用。系统调用是操作系统内核中的函数,C标准库中大部分代码都依赖于它们。每当调用printf()在命令行显示字符串时,C程序都会在幕后向操作系统发出系统调用,把字符串发送到屏幕。

操作系统热线电话 - 图1

下面来看一个系统调用的例子,我们将从一个名副其实的系统调用——system()开始。

system()接收一个字符串参数,并把它当成命令执行:

操作系统热线电话 - 图2

system()函数是在代码中运行其他程序的捷径,特别是在建立快速原型时,与其写很多C代码,不如调用外部程序。

操作系统热线电话 - 图3代码冰箱贴

下面这个程序将一段带有时间戳的文本写到日志文件的底部。整个程序都可以用C语言来写,但程序员用了system()调用,因为它可以更快速地处理文件。

你能补全代码吗?代码创建了一条命令字符串,它先显示注释文本,接着是时间戳。

操作系统热线电话 - 图4

操作系统热线电话 - 图5代码冰箱贴解答

下面这个程序将一段带有时间戳的文本写到日志文件的底部。整个程序都可以用C语言来写,但程序员用了system()调用,因为它可以更快速地处理文件。

你将补全代码。代码创建了一条命令字符串,它先显示注释文本,接着是时间戳。

操作系统热线电话 - 图6

操作系统热线电话 - 图7试驾

编译程序,看看它是如何工作的:

操作系统热线电话 - 图8

当你查看程序所在目录时,程序创建了一个叫reports.log的新文件。

操作系统热线电话 - 图9

程序工作了。它从命令行读取注释,然后调用echo命令把注释追加到文件底部。

整个程序都可以用C语言来写,但你用system()简化了程序,可谓事半功倍。

这里没有蠢问题

问:system()函数会编译到我的程序中吗?

:不会,和所有系统调用一样,system()函数不在你的程序里,而在操作系统中。

问:所以我在进行系统调用时会调用外部代码,像库一样,是吗?

:差不多,但具体细节要看操作系统。在一些操作系统中,系统调用的代码位于操作系统内核。而对其他操作系统而言,系统调用可能保存在动态库中。