_syscall() - Unix、Linux系統呼叫
廣告
名稱
_syscall - 在沒有庫支援的情況下呼叫系統呼叫(已過時)
概要
#include <linux/unistd.h>
A _syscall macro
desired system call
|
描述
關於系統呼叫,最重要的一點是瞭解其原型。您需要知道有多少個引數、引數的型別以及函式的返回型別。有七個宏可以使實際的系統呼叫更容易。它們的格式如下:
_syscallX(type,name,type1,arg1,type2,arg2,...)
|
其中
| 標籤 | 描述 |
| X | 是0-6,表示系統呼叫接受的引數個數 |
| 型別 | 是系統呼叫的返回型別 |
| 名稱 | 是系統呼叫的名稱 |
| typeN | 是第N個引數的型別 |
| argN | 是第N個引數的名稱 |
這些宏建立一個名為name的函式,並帶有您指定的引數。將_syscall()包含到您的原始檔中後,您可以透過name呼叫系統呼叫。
檔案
/usr/include/linux/unistd.h
符合標準
使用這些宏是Linux特有的,並且已棄用。
備註
從核心2.6.18左右開始,_syscall宏已從提供給使用者空間的標頭檔案中刪除。請改用syscall(2)。(某些架構,特別是ia64,從未提供_syscall宏;在這些架構上,始終需要syscall(2)。)
_syscall()宏不會生成原型。您可能需要建立一個,尤其對於C++使用者。
系統呼叫不需要只返回正數或負數錯誤程式碼。您需要閱讀原始碼才能確定它是如何返回錯誤的。通常,它是標準錯誤程式碼的負數,例如-EPERM。當r非負時,_syscall()宏將返回系統呼叫的結果r,但當r為負數時,它將返回-1並將變數errno設定為-r。有關錯誤程式碼,請參閱errno(3)。
定義系統呼叫時,引數型別必須透過值傳遞或透過指標傳遞(對於結構體之類的聚合體)。
示例
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/unistd.h>
#include <linux/kernel.h>
_syscall1(int, sysinfo, struct sysinfo *, info);
/* Note: if you copy directly from the nroff source, remember to
REMOVE the extra backslashes in the printf statement. */
int main(void)
{
struct sysinfo s_info;
int error;
error = sysinfo(&s_info);
printf("code error = %d\n", error);
printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"
"RAM: total %lu / free %lu / shared %lu\n"
"Memory in buffers = %lu\nSwap: total %lu / free %lu\n"
"Number of processes = %d\n",
s_info.uptime, s_info.loads[0],
s_info.loads[1], s_info.loads[2],
s_info.totalram, s_info.freeram,
s_info.sharedram, s_info.bufferram,
s_info.totalswap, s_info.freeswap,
s_info.procs);
exit(EXIT_SUCCESS);
}
|
示例輸出
code error = 0
uptime = 502034s
Load: 1 min 13376 / 5 min 5504 / 15 min 1152
RAM: total 15343616 / free 827392 / shared 8237056
Memory in buffers = 5066752
Swap: total 27881472 / free 24698880
Number of processes = 40
|
參見
廣告
|