tft每日頭條

 > 科技

 > linux系統原理入門

linux系統原理入門

科技 更新时间:2024-12-05 00:48:55
1、系統編程概述

操作系統的職責

操作系統用來管理所有的資源,并将不同的設備和不同的程序關聯起來。

什麼是linux系統編程 ?

在有操作系統的環境下編程,并使用操作系統提供的系統調用及各種庫,對系統資源進行訪問。學會了C語言再知道一些使用系統調用的方法,就可以進行Linux系統編程了。

2、系統調用概述

系統的軟件層次

linux系統原理入門(Linux系統編程-01概述)1

  • 系統調用是操作系統提供給用戶程序的一組“特殊”函數接口。
  • Linux的不同版本提供了兩三百個系統調用。
  • 用戶程序可以通過這組接口獲得操作系統(内核)提供的服務。

例如:用戶可以通過文件系統相關的系統調用,請求系統打開文件、關閉文件或讀寫文件

linux系統原理入門(Linux系統編程-01概述)2

系統調用按照功能邏輯大緻可分為:

進程控制、進程間通信、文件系統控制、系統控制、内存管理、網絡管理、socket控制、用戶管理。

系統調用的返回值 :

通常,用一個負的返回值來表明錯誤,返回一個0值表明成功。錯誤信息存放在全局變量errno中,用戶可用perror函數打印出錯信息。

在Linux中,應用程序編程接口(API)遵循POSIX标準

POSIX标準基于當時現有的UNIX 實踐和經驗,描述了操作系統的系統調用編程接口(實際上就是API),用于保證應用程序可以在源代碼一級上在多種操作系統上移植運行。如:linux下寫的open、write 、read可以直接移植到unix操作系統下

3、系統調用I/O函數

系統調用中操作I/O的函數,都是針對文件描述符的。通過文件描述符可以直接對相應的文件進行操作。

如:open、close、write 、read、ioctl

文件描述符

文件描述符是非負整數。打開現存文件或新建文件時,系統(内核)會返回一個文件描述符。文件描述符用來指定已打開的文件。

#define STDIN_FILENO 0 //标準輸入的文件描述符#define STDOUT_FILENO 1 //标準輸出的文件描述符#define STDERR_FILENO 2 //标準錯誤的文件描述符程序運行起來後這三個文件描述符是默認打開的。

3.1 open函數

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //當文件存在時使用: int open(const char *pathname, int flags); //當文件不存在時使用: int open(const char *pathname,int flags, mode_t mode);

功能:打開一個文件

參數:

pathname:文件的路徑及文件名。flags:open函數的行為标志。mode:文件權限(可讀、可寫、可執行)的設置

返回值:

成功返回打開的文件描述符。失敗返回-1,可以利用perror去查看原因

linux系統原理入門(Linux系統編程-01概述)3

linux系統原理入門(Linux系統編程-01概述)4

3.2 close函數

#include <unistd.h> int close(int fd);

功能:關閉一個文件參數:fd是調用open打開文件返回的文件描述符。返回值:

成功返回0。失敗返回-1,可以利用perror去查看原因。

3.3 write函數

#include <unistd.h> ssize_t write(int fd, const void *addr,size_t count);

功能:把指定數目的數據寫到文件

參數:

fd:文件描述符。addr:數據 首地址。count:寫入數據的字節個數。

返回值:

成功返回實際寫入數據的字節個數。失敗返回-1,可以利用perror去查看原因

3.4 read函數

#include <unistd.h> ssize_t read(int fd, void *addr, size_t count);

功能:

把指定數目的數據讀到 内存

參數:

fd:文件描述符。addr:内存 首地址。count:讀取的字節個數。

返回值:

成功返回實際讀取到的字節個數。失敗返回-1,可以利用perror去查看原因

3.4 remove函數

#include <stdio.h> int remove(const char *pathname);

功能:删除文件

參數:pathname :文件的路名 文件名。返回值:

成功返回0。失敗返回-1,可以利用perror去查看原因。

4、系統調用與庫

庫函數由兩類函數組成

  • 不需要調用系統調用

不需要切換到内核空間即可完成函數全部功能,并且将結果反饋給應用程序,如strcpy、bzero等字符串操作函數。

  • 需要調用系統調用

需要切換到内核空間,這類函數通過封裝系統調用去實現相應功能,如printf、fread等

linux系統原理入門(Linux系統編程-01概述)5

庫 函數與系統調用的關系 :

并不是所有的系統調用都被封裝成了庫函數,系統提供的很多功能都必須通過系統調用才能實現。

系統調用是需要時間的,程序中 頻繁 的使用系統調用會降低程序的運行效率。

當運行内核代碼時,CPU工作在内核态,在系統調用發生前需要保存用戶态的棧和内存環境,然後轉入内核态工作。系統調用結束後,又要切換回用戶态。這種環境的切換會消耗掉許多時間。庫函數訪問文件的時候根據需要,設置不同類型的緩沖區,從而減少了直接調用IO系統調用的次數,提高了訪問效率。

linux系統原理入門(Linux系統編程-01概述)6

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved