open(/dev/ietctl, O_RDWR)
這是文件I/O的常用函數,open函數,open函數用來打開一個設備,他返回的是一個整型變量,如果這個值等於-1,說明打開文件出現錯誤,如果為大於0的值,那麼這個值代表的就是文件描述符。一般的寫法是if((fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY)<0){
perror("open");
}
這個事常用的一種用法fd是設備描述符,linux在操作硬件設備時,屏蔽了硬件的基本細節,只把硬件當做文件來進行操作,而所有的操作都是以open函數來開始,它用來獲取fd,然後後期的其他操作全部控制fd來完成對硬件設備的實際操作。你要打開的/dev/ttyS0,代表的是串口1,也就是常說的com1,後面跟的是一些控制字。int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;這個就是open函數的公式。控制字可以有多種,我現在給你列出來:
O_RDONLY 只讀打開。
O_WRONLY 只寫打開。
O_RDWR 讀、寫打開。
O_APPEND 每次寫時都加到文件的尾端。
O_CREAT 若此文件不存在則創建它。使用此選擇項時,需同時說明第三個參數mode,用其說明該新文件的存取許可權位。
O_EXCL 如果同時指定了O_CREAT,而文件已經存在,則出錯。這可測試一個文件是否存在,如果不存在則創建此文件成為一個原子操作。
O_TRUNC 如果此文件存在,而且為只讀或只寫成功打開,則將其長度截短為0。
O_NOCTTY 如果p a t h n a m e指的是終端設備,則不將此設備分配作為此進程的控制終端。
O_NONBLOCK 如果p a t h n a m e指的是一個F I F O、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和後續的I / O操作設置非阻塞方式。
O_SYNC 使每次w r i t e都等到物理I / O操作完成。
這些控制字都是通過“或”符號分開(|)
當調用系統調用open時,操作系統會將文件系統對應設備文件的inode中的file_operations安裝進用戶進程的task_struct中的file_struct,然後再調用具體文件的file_operations中的open函數,其他的read、write等等也是如此,所以實際上open操作實際上是一個連接過程,我個人認為稱其為open容易誤導。至於file_operations中的針對底層硬件的操作,簡單地說實際上就是對具體硬件接口的控制/狀態寄存器和數據寄存器的讀寫,如硬盤這種硬件有其自己的控制器,所以他自己內部會定期處理寄存器的命令和數據,完成相應的操作請求,請求完成後cpu發中斷。