最近我正在学习操作系统..我只是想知道:
系统调用(如write())和标准库函数(如printf())之间有什么区别?
系统调用是对不属于应用程序但在内核内的函数的调用。 内核是一个软件层,为您提供一些基本的功能来将硬件抽象为您。 内核大概是把你的硬件变成软件的东西。
你总是最终使用write()
在外设上写任何东西,不管你写的是哪种设备。 write()
被设计为只写一个字节序列,这是所有,没有更多。 但是由于write()
被认为是过于基本的(你可能想要在十个基础上编写一个整数,或者用科学记数法编写一个浮点数等等),不同的库可以通过不同类型的编程环境提供给您。
例如,C编程语言为您提供了printf()
,它允许您以多种不同的格式写入数据。 所以,你可以理解printf()
函数将数据转换为格式化的字节序列,并调用write()
将这些字节写入输出。 但C ++给你cout
; Java System.out.println
等。这些函数中的每一个函数都会结束对write()
的调用。
有一件事要知道(重要的)是这样的系统调用是昂贵的! 它不是一个简单的函数调用,因为你需要调用一些你自己代码之外的东西,系统必须确保你没有试图做坏事等等。所以在更高级的打印类函数中是很常见的缓冲是内置的; 这样写并不总是被调用,但是你的数据被保存在一些隐藏的结构中,并且只在真正需要或者必要的时候才写(缓冲区已满或者你真的希望看到你的打印结果)。
这正是你管理你的钱时发生的事情。 如果很多人给你5块钱,你不会去银行存款! 你随时保持钱包(这是印刷品 ),直到它已经满了,或者你不想保留它们。 然后,你去银行,并作出一个大的存款(这是写 )。 而且你知道把5块钱放到你的钱包里要比去银行存款要快得多。 银行是内核/操作系统。
系统调用由操作系统实现,并以内核模式运行。 库函数在用户模式下实现,就像应用程序代码一样。 库函数可能会调用系统调用(例如, printf
最终调用write
),但这取决于库函数的用途(数学函数通常不需要使用内核)。
OS中的系统调用用于与OS进行交互。 例如Write()可以用于系统或程序中。
虽然标准库函数是程序特定的,例如printf()会打印出来,但它只会在GUI /命令行中而不会影响系统。
对不起,不能评论,因为我需要50声望评论。
编辑:Barmar有很好的答案
我正在写一个小程序。 目前它只是从标准输入读取每一行,并将其打印到标准输出。 我可以在循环中添加一个调用来写入,并在每行的末尾添加几个字符。 但是当我使用printf的时候,所有的额外字符都是聚集在一起的,而不是出现在每一行上。
看来,使用printf导致stderr被缓冲。 添加fflush(stdout);
在调用printf之后修复了输出的差异。