sysctl() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考資料     討論論壇     關於 TP  

sysctl() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

sysctl - 讀取/寫入系統引數

概要

#include <unistd.h> 

#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args);

描述

sysctl() 呼叫讀取和/或寫入核心引數。例如,主機名或最大開啟檔案數。引數具有以下形式

struct __sysctl_args {
    int    *name;    /* integer vector describing variable */
    int     nlen;    /* length of this vector */
    void   *oldval;  /* 0 or address where to store old value */
    size_t *oldlenp; /* available room for old value,
                        overwritten by actual size of old value */
    void   *newval;  /* 0 or address of new value */
    size_t  newlen;  /* size of new value */
};

此呼叫在一個樹狀結構中進行搜尋,可能類似於/proc/sys下的目錄樹,如果找到請求的專案,則呼叫一些適當的例程來讀取或修改值。

返回值

成功完成時,sysctl() 返回 0。否則,返回 -1,並設定errno以指示錯誤。

錯誤

標籤描述
EFAULT 呼叫透過設定oldval為非 NULL 來請求先前的值,但允許在oldlenp中留有零空間。
ENOTDIR
  未找到name
EPERM 對遇到的某個“目錄”沒有搜尋許可權,或者在oldval非零時沒有讀取許可權,或者在newval非零時沒有寫入許可權。

符合標準

此呼叫是 Linux 特定的,不應在旨在可移植的程式中使用。自 1.3.57 版本以來,Linux 中就存在sysctl() 呼叫。它起源於 4.4BSD。只有 Linux 具有/proc/sys映象,並且 Linux 和 4.4BSD 的物件命名方案有所不同,但是sysctl(2) 函式的宣告在兩者中是相同的。

缺陷

物件名稱因核心版本而異。這使得此係統呼叫對於應用程式毫無用處。請改用/proc/sys介面。

並非所有可用的物件都已正確記錄。

目前尚無法透過寫入/proc/sys/kernel/ostype來更改作業系統。

示例

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args );

#define OSNAMESZ 100

int main(void) { struct __sysctl_args args; char osname[OSNAMESZ]; size_t osnamelth; int name[] = { CTL_KERN, KERN_OSTYPE };

memset(&args, 0, sizeof(struct __sysctl_args)); args.name = name; args.nlen = sizeof(name)/sizeof(name[0]); args.oldval = osname; args.oldlenp = &osnamelth;

osnamelth = sizeof(osname); if (syscall(SYS__sysctl, &args) == -1) { perror("_sysctl"); exit(EXIT_FAILURE); } printf("This machine is running %*s\n", osnamelth, osname); exit(EXIT_SUCCESS); }

備註

Glibc 沒有為此係統呼叫提供包裝器;請使用syscall(2) 呼叫它。

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.