欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

了解各種系統(tǒng)調(diào)用助你成為一名Linux下編程高手

5RJg_mcuworld ? 來源:未知 ? 作者:胡薇 ? 2018-05-14 11:10 ? 次閱讀

什么是系統(tǒng)調(diào)用?

Linux內(nèi)核中設置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用。用戶可以通過系統(tǒng)調(diào)用命令在自己的應用程序中調(diào)用它們。從某種角度來看,系統(tǒng)調(diào)用和普通的函數(shù)調(diào)用非常相似。區(qū)別僅僅在于,系統(tǒng)調(diào)用由操作系統(tǒng)核心提供,運行于核心態(tài);而普通的函數(shù)調(diào)用由函數(shù)庫或用戶自己提供,運行于用戶態(tài)。

隨Linux核心還提供了一些C語言函數(shù)庫,這些庫對系統(tǒng)調(diào)用進行了一些包裝和擴展,因為這些庫函數(shù)與系統(tǒng)調(diào)用的關(guān)系非常緊密,所以習慣上把這些函數(shù)也稱為系統(tǒng)調(diào)用。

為什么要用系統(tǒng)調(diào)用?

實際上,很多已經(jīng)被我們習以為常的C語言標準函數(shù),在Linux平臺上的實現(xiàn)都是靠系統(tǒng)調(diào)用完成的,所以如果想對系統(tǒng)底層的原理作深入的了解,掌握各種系統(tǒng)調(diào)用是初步的要求。進一步,若想成為一名Linux下編程高手,也就是我們常說的Hacker,其標志之一也是能對各種系統(tǒng)調(diào)用有透徹的了解。

即使除去上面的原因,在平常的編程中你也會發(fā)現(xiàn),在很多情況下,系統(tǒng)調(diào)用是實現(xiàn)你的想法的簡潔有效的途徑,所以有可能的話應該盡量多掌握一些系統(tǒng)調(diào)用,這會對你的程序設計過程帶來意想不到的幫助。

系統(tǒng)調(diào)用是怎么工作的?

一般的,進程是不能訪問內(nèi)核的。它不能訪問內(nèi)核所占內(nèi)存空間也不能調(diào)用內(nèi)核函數(shù)。CPU硬件決定了這些(這就是為什么它被稱作"保護模式")。系統(tǒng)調(diào)用是這些規(guī)則的一個例外。其原理是進程先用適當?shù)闹堤畛?a href="http://www.delux-kingway.cn/tags/寄存器/" target="_blank">寄存器,然后調(diào)用一個特殊的指令,這個指令會跳到一個事先定義的內(nèi)核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在Intel CPU中,這個由中斷0x80實現(xiàn)。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作為操作系統(tǒng)的內(nèi)核--所以你就可以為所欲為。

進程可以跳轉(zhuǎn)到的內(nèi)核位置叫做sysem_call。這個過程檢查系統(tǒng)調(diào)用號,這個號碼告訴內(nèi)核進程請求哪種服務。然后,它查看系統(tǒng)調(diào)用表(sys_call_table)找到所調(diào)用的內(nèi)核函數(shù)入口地址。接著,就調(diào)用函數(shù),等返回后,做一些系統(tǒng)檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。

具體過程如下圖所示:

如何使用系統(tǒng)調(diào)用?

先來看一個例子:

這是因為在time.h中實際上已經(jīng)用庫函數(shù)的形式實現(xiàn)了time這個系統(tǒng)調(diào)用,替我們省掉了調(diào)用_syscall1宏展開得到函數(shù)原型這一步。

大多數(shù)系統(tǒng)調(diào)用都在各種C語言函數(shù)庫中有所實現(xiàn),所以在一般情況下,我們都可以像調(diào)用普通的庫函數(shù)那樣調(diào)用系統(tǒng)調(diào)用,只在極個別的情況下,我們才有機會用到_syscall*()這幾個宏。

調(diào)用性能問題

系統(tǒng)調(diào)用需要從用戶空間陷入內(nèi)核空間,處理完后,又需要返回用戶空間。其中除了系統(tǒng)調(diào)用服務例程的實際耗時外,陷入/返回過程和系統(tǒng)調(diào)用處理程序(查系統(tǒng)調(diào)用表、存儲\恢復用戶現(xiàn)場)也需要花銷一些時間,這些時間加起來就是一個系統(tǒng)調(diào)用的響應速度。系統(tǒng)調(diào)用不比別的用戶程序,它對性能要求很苛刻,因為它需要陷入內(nèi)核執(zhí)行,所以和其他內(nèi)核程序一樣要求代碼簡潔、執(zhí)行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進出內(nèi)核都被優(yōu)化得簡潔高效;同時所有Linux系統(tǒng)調(diào)用處理程序和每個系統(tǒng)調(diào)用本身也都非常簡潔。

絕大多數(shù)情況下,Linux系統(tǒng)調(diào)用性能是可以接受的,但是對于一些對性能要求非常高的應用來說,它們雖然希望利用系統(tǒng)調(diào)用的服務,但卻希望加快相應速度,避免陷入/返回和系統(tǒng)調(diào)用處理程序帶來的花銷,因此采用由內(nèi)核直接調(diào)用系統(tǒng)調(diào)用服務例程,最好的例子就HTTPD——它為了避免上述開銷,從內(nèi)核調(diào)用socket等系統(tǒng)調(diào)用服務例程。

Linux系統(tǒng)調(diào)用列表

· 進程控制

fork 創(chuàng)建一個新進程

clone 按指定條件創(chuàng)建子進程

execve 運行可執(zhí)行文件

exit 中止進程

_exit 立即中止當前進程

getdtablesize 進程所能打開的最大文件數(shù)

getpgid 獲取指定進程組標識號

setpgid 設置指定進程組標志號

getpgrp 獲取當前進程組標識號

setpgrp 設置當前進程組標志號

getpid 獲取進程標識號

getppid 獲取父進程標識號

getpriority 獲取調(diào)度優(yōu)先級

setpriority 設置調(diào)度優(yōu)先級

modify_ldt 讀寫進程的本地描述表

nanosleep 使進程睡眠指定的時間

nice 改變分時進程的優(yōu)先級

pause 掛起進程,等待信號

personality 設置進程運行域

prctl 對進程進行特定操作

ptrace 進程跟蹤

sched_get_priority_max 取得靜態(tài)優(yōu)先級的上限

sched_get_priority_min 取得靜態(tài)優(yōu)先級的下限

sched_getparam 取得進程的調(diào)度參數(shù)

sched_getscheduler 取得指定進程的調(diào)度策略

sched_rr_get_interval 取得按RR算法調(diào)度的實時進程的時間片長度

sched_setparam 設置進程的調(diào)度參數(shù)

sched_setscheduler 設置指定進程的調(diào)度策略和參數(shù)

sched_yield 進程主動讓出處理器,并將自己等候調(diào)度隊列隊尾

vfork 創(chuàng)建一個子進程,以供執(zhí)行新程序,常與execve等同時使用

wait 等待子進程終止

wait3 參見wait

waitpid 等待指定子進程終止

wait4 參見waitpid

capget 獲取進程權(quán)限

capset 設置進程權(quán)限

getsid 獲取會晤標識號

setsid 設置會晤標識號

· 文件系統(tǒng)控制

1.文件讀寫操作

fcntl 文件控制

open 打開文件

creat 創(chuàng)建新文件

close 關(guān)閉文件描述字

read 讀文件

write 寫文件

readv 從文件讀入數(shù)據(jù)到緩沖數(shù)組中

writev 將緩沖數(shù)組里的數(shù)據(jù)寫入文件

pread 對文件隨機讀

pwrite 對文件隨機寫

lseek 移動文件指針

_llseek 在64位地址空間里移動文件指針

dup 復制已打開的文件描述字

dup2 按指定條件復制文件描述字

flock 文件加/解鎖

poll I/O多路轉(zhuǎn)換

truncate 截斷文件

ftruncate 參見truncate

umask 設置文件權(quán)限掩碼

fsync 把文件在內(nèi)存中的部分寫回磁盤

2.文件系統(tǒng)操作

access 確定文件的可存取性

chdir 改變當前工作目錄

fchdir 參見chdir

chmod 改變文件方式

fchmod 參見chmod

chown 改變文件的屬主或用戶組

fchown 參見chown

lchown 參見chown

chroot 改變根目錄

stat 取文件狀態(tài)信息

lstat 參見stat

fstat 參見stat

statfs 取文件系統(tǒng)信息

fstatfs 參見statfs

readdir 讀取目錄項

getdents 讀取目錄項

mkdir 創(chuàng)建目錄

mknod 創(chuàng)建索引節(jié)點

rmdir 刪除目錄

rename 文件改名

link 創(chuàng)建鏈接

symlink 創(chuàng)建符號鏈接

unlink 刪除鏈接

readlink 讀符號鏈接的值

mount 安裝文件系統(tǒng)

umount 卸下文件系統(tǒng)

ustat 取文件系統(tǒng)信息

utime 改變文件的訪問修改時間

utimes 參見utime

quotactl 控制磁盤配額

· 系統(tǒng)控制

ioctl I/O總控制函數(shù)

_sysctl 讀/寫系統(tǒng)參數(shù)

acct 啟用或禁止進程記賬

getrlimit 獲取系統(tǒng)資源上限

setrlimit 設置系統(tǒng)資源上限

getrusage 獲取系統(tǒng)資源使用情況

uselib 選擇要使用的二進制函數(shù)庫

ioperm 設置端口I/O權(quán)限

iopl 改變進程I/O權(quán)限級別

outb 低級端口操作

reboot 重新啟動

swapon 打開交換文件和設備

swapoff 關(guān)閉交換文件和設備

bdflush 控制bdflush守護進程

sysfs 取核心支持的文件系統(tǒng)類型

sysinfo 取得系統(tǒng)信息

adjtimex 調(diào)整系統(tǒng)時鐘

alarm 設置進程的鬧鐘

getitimer 獲取計時器值

setitimer 設置計時器值

gettimeofday 取時間和時區(qū)

settimeofday 設置時間和時區(qū)

stime 設置系統(tǒng)日期和時間

time 取得系統(tǒng)時間

times 取進程運行時間

uname 獲取當前UNIX系統(tǒng)的名稱、版本和主機等信息

vhangup 掛起當前終端

nfsservctl 對NFS守護進程進行控制

vm86 進入模擬8086模式

create_module 創(chuàng)建可裝載的模塊項

delete_module 刪除可裝載的模塊項

init_module 初始化模塊

query_module 查詢模塊信息

*get_kernel_syms 取得核心符號,已被query_module代替

· 內(nèi)存管理

brk 改變數(shù)據(jù)段空間的分配

sbrk 參見brk

mlock 內(nèi)存頁面加鎖

munlock 內(nèi)存頁面解鎖

mlockall 調(diào)用進程所有內(nèi)存頁面加鎖

munlockall 調(diào)用進程所有內(nèi)存頁面解鎖

mmap 映射虛擬內(nèi)存頁

munmap 去除內(nèi)存頁映射

mremap 重新映射虛擬內(nèi)存地址

msync 將映射內(nèi)存中的數(shù)據(jù)寫回磁盤

mprotect 設置內(nèi)存映像保護

getpagesize 獲取頁面大小

sync 將內(nèi)存緩沖區(qū)數(shù)據(jù)寫回硬盤

cacheflush 將指定緩沖區(qū)中的內(nèi)容寫回磁盤

· 網(wǎng)絡管理

getdomainname 取域名

setdomainname 設置域名

gethostid 獲取主機標識號

sethostid 設置主機標識號

gethostname 獲取本主機名稱

sethostname 設置主機名稱

· socket控制

socketcall socket系統(tǒng)調(diào)用

socket 建立socket

bind 綁定socket到端口

connect 連接遠程主機

accept 響應socket連接請求

send 通過socket發(fā)送信息

sendto 發(fā)送UDP信息

sendmsg 參見send

recv 通過socket接收信息

recvfrom 接收UDP信息

recvmsg 參見recv

listen 監(jiān)聽socket端口

select 對多路同步I/O進行輪詢

shutdown 關(guān)閉socket上的連接

getsockname 取得本地socket名字

getpeername 獲取通信對方的socket名字

getsockopt 取端口設置

setsockopt 設置端口參數(shù)

sendfile 在文件或端口間傳輸數(shù)據(jù)

socketpair 創(chuàng)建一對已聯(lián)接的無名socket

· 用戶管理

getuid 獲取用戶標識號

setuid 設置用戶標志號

getgid 獲取組標識號

setgid 設置組標志號

getegid 獲取有效組標識號

setegid 設置有效組標識號

geteuid 獲取有效用戶標識號

seteuid 設置有效用戶標識號

setregid 分別設置真實和有效的的組標識號

setreuid 分別設置真實和有效的用戶標識號

getresgid 分別獲取真實的,有效的和保存過的組標識號

setresgid 分別設置真實的,有效的和保存過的組標識號

getresuid 分別獲取真實的,有效的和保存過的用戶標識號

setresuid 分別設置真實的,有效的和保存過的用戶標識號

setfsgid 設置文件系統(tǒng)檢查時使用的組標識號

setfsuid 設置文件系統(tǒng)檢查時使用的用戶標識號

getgroups 獲取后補組標志清單

setgroups 設置后補組標志清單

· 進程間通信

ipc 進程間通信總控制調(diào)用

信號

sigaction 設置對指定信號的處理方法

sigprocmask 根據(jù)參數(shù)對信號集中的信號執(zhí)行阻塞/解除阻塞等操作

sigpending 為指定的被阻塞信號設置隊列

sigsuspend 掛起進程等待特定信號

signal 參見signal

kill 向進程或進程組發(fā)信號

*sigblock 向被阻塞信號掩碼中添加信號,已被sigprocmask代替

*siggetmask 取得現(xiàn)有阻塞信號掩碼,已被sigprocmask代替

*sigsetmask 用給定信號掩碼替換現(xiàn)有阻塞信號掩碼,已被sigprocmask代替

*sigmask 將給定的信號轉(zhuǎn)化為掩碼,已被sigprocmask代替

*sigpause 作用同sigsuspend,已被sigsuspend代替

sigvec 為兼容BSD而設的信號處理函數(shù),作用類似sigaction

ssetmask ANSI C的信號處理函數(shù),作用類似sigaction

消息

msgctl 消息控制操作

msgget 獲取消息隊列

msgsnd 發(fā)消息

msgrcv 取消息

管道

pipe 創(chuàng)建管道

信號量

semctl 信號量控制

semget 獲取一組信號量

semop 信號量操作

共享內(nèi)存

shmctl 控制共享內(nèi)存

shmget 獲取共享內(nèi)存

shmat 連接共享內(nèi)存

shmdt 拆卸共享內(nèi)存

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11350

    瀏覽量

    210477
  • 系統(tǒng)調(diào)用

    關(guān)注

    0

    文章

    28

    瀏覽量

    8357

原文標題:若想成為一名Linux下編程高手,必須能對各種系統(tǒng)調(diào)用有透徹的了解

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統(tǒng)是當今科技領(lǐng)域的核心,而C語言則是嵌入式系統(tǒng)開發(fā)中最常用的
    發(fā)表于 03-25 14:12

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統(tǒng)是當今科技領(lǐng)域的核心,而C語言則是嵌入式系統(tǒng)開發(fā)中最常用的
    發(fā)表于 04-07 16:03

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?
    發(fā)表于 05-21 12:04

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    的嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展和廣泛應用。面對如此火熱的行業(yè),如何才能成為嵌入式Linux開發(fā)工程師?成為一名合格的嵌入式
    發(fā)表于 11-05 11:23

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    新興的嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展和廣泛應用。面對如此火熱的行業(yè),如何才能成為嵌入式Linux開發(fā)工程師?成為一名合格的嵌入式
    發(fā)表于 04-15 09:35

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?隨著嵌入式行業(yè)的迅猛發(fā)展,嵌入式Linux憑借其系統(tǒng)發(fā)展的成熟度、市場應用的高份額也受到
    發(fā)表于 06-05 11:31

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?隨著嵌入式行業(yè)的迅猛發(fā)展,嵌入式Linux憑借其系統(tǒng)發(fā)展的成熟度、市場應用的高份額也受到
    發(fā)表于 11-13 10:04

    成為一名嵌入式Linux開發(fā)工程師需要學習哪些知識?

    的嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展和廣泛應用。面對如此火熱的行業(yè),如何才能成為嵌入式Linux開發(fā)工程師?成為一名合格的嵌入式
    發(fā)表于 05-23 10:15

    如何成為一名電源設計師?

    成為一名電源設計師的7個跡象
    發(fā)表于 03-11 06:02

    如何才能成為一名單片機高手?

    如何才能成為一名單片機高手?學習單片機的三個步驟你都知道嗎
    發(fā)表于 07-01 07:01

    如何成為一名嵌入式linux開發(fā)工程師?

    成為一名嵌入式linux開發(fā)工程師需要儲備哪些“干糧”?...
    發(fā)表于 11-05 07:03

    如何成為一名優(yōu)秀的嵌入式工程師?

    了解到最新的技術(shù)和趨勢,同時也可以提高自己的編程水平。 要成為一名優(yōu)秀的嵌入式工程師,需要不斷學習和實踐,掌握C語言的基礎(chǔ)知識,同時也要關(guān)注嵌入式的發(fā)展和變化,不斷提高自己的
    發(fā)表于 11-07 15:36

    了解系統(tǒng)調(diào)用助你成為Linux編程高手

    Linux內(nèi)核中設置了組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用。用戶可以通過系統(tǒng)
    的頭像 發(fā)表于 05-11 11:27 ?3475次閱讀
    透<b class='flag-5'>了解</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b><b class='flag-5'>助你</b><b class='flag-5'>成為</b><b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>編程</b><b class='flag-5'>高手</b>

    如何成為一名優(yōu)秀的Linux工程師

    的個人能力有所不同,想要成為一名優(yōu)秀的工程師是需要我們往相應的方向努力的。那么,如何成為一名優(yōu)秀的Linux工程師呢?本文聊
    的頭像 發(fā)表于 08-21 15:40 ?3155次閱讀

    成為一名嵌入式linux開發(fā)工程師需要儲備哪些“干糧”?

    成為一名嵌入式linux開發(fā)工程師需要儲備哪些“干糧”?
    發(fā)表于 11-02 09:36 ?18次下載
    <b class='flag-5'>成為</b><b class='flag-5'>一名</b>嵌入式<b class='flag-5'>linux</b>開發(fā)工程師需要儲備哪些“干糧”?