如何使用系统调用
下面通过一个简单的例子来说明在用户程序中是如何使用系统调用的。例如,要写一个简单的程序,用于从一个文件中读出数据,再将该数据复制到另一文件中。为此,首先须输入该程序的输入文件名和输出文件名。文件名可用多种方式指定,一种方式是由程序询问用户两个文件的名字。
在交互式系统中,该方式要使用一系列的系统调用,先在屏幕上打印出一系列的提示信息,然后从键盘终端读入定义两个义件名的字符串。一旦获得两个文件名后,程序又必须利用系统凋用open去打开输入文件,并用系统凋用creat去创建指定的输出文件;在执行叩⑶系统调用时,又可能发生错误。
例如,程序试图去打开一个不存在的文件;或者该文件虽然存在,但并不允许被访问等。此时,程序又须利用一系列系统调用去显示出错信息,继而再利用一个系统凋用去实现程序的异常终止。类似地,在执行系统调用creat时,同样可能出现错误。例如,系统中存在与输出文件同名的另一文件,这时又须利用一系统调用来结束程序;或者利用一个系统调用来删除巳存在的那个同名文件,然后,再利用creat?泶唇ㄊ涑鑫募??/p>
在打开输入文件和创建输出文件都获得成功后,还须利用_请内存的系统调用alloc根据文件的大小申请一个缓冲区。成功后,再利用read系统凋用从输入文件中把数据读到缓冲区内,读完后,再用系统调用close去关闭输入文件。然后利用write系统调用,把缓冲区内的数据写到输出文件中。在读或写操作中,也都可能需要回送各种出错信息。
比如,在输入时可能发现已到达文件末尾(指定的字符数尚未读够),或者,在读过程中发现硬件故障(如奇、偶错);在写操作中可能遇见各种与输出设备类型有关的错误,比如,已无磁盘空间,打印机缺纸等。在将整个文件复制完后,程序又须凋用close去关闭输出文件,并向控制台回送一条消息以提示复制完毕。最后,再利用系统调用exit使程序正常结?c。
通过这个例子可以看出,一个用户程序将频繁地利用各种系统调用以取得OS所提供的各种服务。