一、操作系統的體系結構
計算機是由一堆硬件組成的,操作系統是為了有效的控制這些硬件資源的軟件。操作系統除了有效地控制這些硬件資源的分配,並提供計算機運行所需要的功能之外,為了提供程序員更容易開發軟件的環境,操作系統還提供了一整組系統調用接口。
如上圖所示,最中間的是硬件,操作系統是由內核和系統調用接口組成,其中內核是直接操作硬件的,內核提供了對這些硬件資源的控制和進程管理,系統調用接口向上提供了統一的調用接口方便開發人員調用。最上層就是應用程序,在應用程序中調用系統接口就能實現對硬件的操作。
二、Linux I/O系統
如上圖Linux的I/O系統結構圖,內核層有一個虛擬文件系統,就是使用標准的c類庫封裝的api,所以我們要操作文件系統只需要調用這裡的api即可。
三、I/O的操作過程
1、打開文件一個應用程序通過要求內核打開相應的文件,宣告他要訪問一個I/O設備,內核返回一個非負整數,叫描述符號(DescriptZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcqOpob7OxLz+zqjSu7HqyrahvzKhorbB0LTOxLz+tsGjurTTzsS8/r+9sbRuPjC49tfWvdq1vbTmtKLG96OoxNq05qOp0LSjurTTtOa0osb3o6jE2rTmo6m/vbG0bj4wuPbX1r3atb3OxLz+M6GiuMSx5M7EvP7Ou9bDNKGiudix1c7EvP621NPaxNq6y7b40dSjrMv509C08r+qzsS8/ra808nOxLz+w+jK9rf70v3Tw6GjzsS8/sPoyva3+8rH0ru49rfHuLrV+8r9oaO1sbTyv6rSu7j2z9a05s7EvP678rS0vajSu7j20MLOxLz+yrGjrMTausvP8r34s8y3tbvY0ru49s7EvP7D6Mr2t/uho7WxtsHQtNK7uPbOxLz+yrGjrNPDb3BlbrvyY3JlYXRlt7W72LXEzsS8/sPoyva3+2ZkserKtrjDzsS8/qOsvavG5Nf3zqqyzsr9tKvLzbj4cmVhZLvyd3JpdGUutvjB9yjI5zogZm9wZW4pt7W72LXEysfSu7j2RklMRb3hubnWuNXrLCBGSUxFveG5ucrHsPy6rNPQzsS8/sPoyva3+7XEo6xGSUxFveG5ubqvyv2/ydLUv7TX98rHttRmZNaxvdOy2df3tcTPtc2ztffTw7XEt+LXsCwgy/y1xNPFtePKx7T409BJL0+7urTmPHA+TGludXjWp7PWuPfW1rj30fm1xM7EvP7Ptc2zuPHKvaOsyOdleHQyoaJleHQzoaJyZWlzZXJmc6GiRkFUoaJOVEZToaJpc285NjYwtci1yKOssrvNrLXEtMXFzLfWx/ihornixcy78sbky/y05rSiyeixuLa809Cyu82stcTOxLz+z7XNs7jxyr2jrMi7tvjV4tCpzsS8/s+1zbO2vL/J0tRtb3VudLW9xLO49sS/wrzPwqOsyrnO0sPHv7S1vdK7uPbNs9K7tcTEv8K8yvejrLj31tbOxLz+z7XNs8nPtcTEv8K8us3OxLz+ztLDx9PDbHPD/MHuv7TG8MC0ysfSu9H5tcSjrLbB0LSy2df308PG8MC00rK2vMrH0rvR+bXEo6zV4srH1PXDtNf2tb21xMTYo79MaW51eMTausvU2rj31tayu82stcTOxLz+z7XNs7jxyr3WrsnP1/bBy9K7uPaz6c/zsuOjrMq5tcPOxLz+oaLEv8K8oaK2wdC0t8POyrXIuMXE7rPJzqqz6c/zsuO1xLjFxO6jrNLytMu499bWzsS8/s+1zbO/tMbwwLTTw8bwwLS2vNK70fmjrNXiuPaz6c/zsuOzxs6q0OnE4s7EvP7Ptc2zo6hWRlOjrFZpcnR1YWwgRmlsZXN5c3RlbaOpPC9wPjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20140825/2014082508530025.png" alt="\" />
四、Linux底層輸入輸出
我們可以去GNU下載libc的源代碼和幫助文檔(源碼下載地址:http://ftp.gnu.org/gnu/glibc/)打開和關閉文件流
#include
#include
#include
#include
#include
int main(int argc, char *argv[]){
//open file
if(argc<2){
printf("please input filename\n");
exit(1);
}else{
int fd;
umask(0000);
fd = open(argv[1], O_RDWR|O_CREAT, 0666);
if(fd < -1){
printf("error\n");
exit(1);
}else{
printf("success=%d\n", fd);
close(fd);
printf("closed\n");
}
}
return 0;
}
讀文件(寫文件的過程和讀文件類似)
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]){
//open file
if(argc<2){
printf("please input filename\n");
exit(1);
}else{
int fd;
umask(0000);
fd = open(argv[1], O_RDWR|O_CREAT, 0666);
if(fd < -1){
printf("error\n");
exit(1);
}else{
printf("success=%d\n", fd);
char buf[1024];
memset(buf, 0, 1024);
int returnum = read(fd, buf, 1024);
if(returnum != -1){
printf("buf=%s\n", buf);
}else{
printf("read error\n");
exit(1);
}
close(fd);
printf("closed\n");
}
}
return 0;
}