linux程式設計——linux環境(第四章)

來源:互聯網
上載者:User

標籤:

4.5    使用者資訊這篇為linux環境,代碼在linux環境代碼下載。除了著名的init程式以外,所有的linux程式都是由其他程式或使用者啟動的。(核心自行啟動(已經被載入記憶體,開始運行,並已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導進程。所以init始終是第一個進程(其進程編號始終為1)。
當一個使用者登入進linux系統時,使用者有一個使用者名稱和密碼,一旦使用者名稱和密碼通過驗證,使用者就可以進入一個shell。從內部機制來說,使用者還有一個唯一的使用者識別碼UID, linux啟動並執行每個程式實際上都是以某個使用者的名義在運行,因此都有一個關聯的UID。
可以對程式進行設定,讓它們的運行看上去好像是由另一個使用者啟動的,當一個程式的SUID位被置位時,它的運行就好像是由該可執行檔的屬主啟動的。當su命令被執行時,程式的運行就好像是由超級使用者啟動的,它隨後驗證使用者的存取權限,將UID改為目標賬戶的UID值並進行該賬戶的登入shell。
UID由它自己的類型-uid_t,通常是一個小整數。
#include <sys/types.h>
#include <unistd.h>
uid_t getuid(void);
char* getlogin(void);
getuid函數返回程式關聯的UID,它通常是啟動程式的使用者的UID。
getlogin函數返回與目前使用者關聯的登入名稱。
系統檔案/etc/passwd包含一個使用者帳號資料庫。它由行組成,每行對應一個使用者,包括使用者名稱、加密口令、使用者識別碼(UID)、群組識別碼(GID)、全名、家目錄和預設shell。例如
liu:x:1000:1000:liu:/home/liu:/bin/bash
人們定義了一組函數提供一個標準而又有效擷取使用者資訊的編程介面:
#include <sys/type.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
密碼資料庫結構passwd定義在標頭檔pwd.h中,它包含以下成員:
passwd成員                  說明
char* pw_name           使用者登入名稱
uid_t pw_uid                 UID號
gid_t pw_gid                 GID號
char* pw_dir                 使用者家目錄
char* pw_gecos          使用者全名
char* pw_shell            使用者預設shell
getpwuid和getpwnam函數都返回一個指標,該指標指向與某個使用者對應的passwd結構。這個使用者通過getpwuid的UID參數或通過getpwnam的使用者登入名稱參數來確定。出措時,它們都返回一個null 指標。
編寫user.c程式從密碼資料庫中提取出一些使用者資訊。
4.6    主機資訊正如程式可以尋找使用者資訊一樣,程式也可以獲得運行它的電腦的有關細節。uname命令就提供這類資訊。
主機資訊在許多情況下都很有用,可能需要根據程式啟動並執行機器在網路上的名字來定製程式的行為。
如果系統安裝了網路組件,可以通過gethostname函數擷取它的網路名稱:
#include <unistd.h>
int gethostname(char* name, size_t namelen);
gethostname函數把機器的網路名稱寫入name字串,該字串至少由namelen個字元長。成功時,返回0,否則返回-1。
可以通過uname系統調用獲得關於主機的更多詳細資料:
#include <sys/utsname.h>
int uname(struct ustname* name);
uname函數把主機資訊寫入name參數指向的結構。
編寫程式hostget.c提出一些主機資訊
4.7    日誌許多應用程式需要記錄它們的活動,系統程式經常需要向控制台或者記錄檔寫訊息。這些訊息可能指示錯誤、警告或者與系統狀態有關的一般資訊。
通常這些日誌資訊被記錄在系統檔案中,而這些系統檔案被儲存在專用於此目的的目錄中,可能是/usr/adm或者/var/log目錄。
雖然系統訊息的格式和儲存方式不盡相同,但產生訊息的方式卻是標準的。UNIX規範通過syslog函數為所有程式產生日誌資訊提供了一個介面:
#include <syslog.h>
void syslog(int priority, const char *message, arguments...);
syslog函數向系統的日誌設施發送一條日誌資訊。每條訊息都有一個priority參數,該參數是一個嚴重層級與一個設施值的按位或。
編寫程式syslog.c
可以使用setlongmask函數來設定一個日誌掩碼,通過它來控制日誌資訊的優先順序。優先順序在日誌掩碼中置位的後續syslog調用都將被丟棄。
編寫程式logmask.c
logmask.c還用到了getpid函數,它和getppid的定義如下:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
兩個函數分別返回調用進程和調用進程的父進程的進程標識符PID
4.8    資源和限制linux系統上啟動並執行程式會受到資源限制的影響。它們可能是硬體方面的物理性限制(例如記憶體)、系統策略的限制(例如允許使用的CPU時間)或者具體實現的限制(例如整數的長度或檔案名稱中所允許的的最大字元數)。
標頭檔sys/resource.h提供了資源操作方面的定義,其中包括程式長度、執行優先順序和檔案資源等方面限制進行查詢和設定的函數:
#include <sys/resource.h>
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int priority);
int getrlimit(int resource, struct rlimit *r_limit);
int setrlimit(int resource, const struct rlimit *r_limit);
int getrusage(int who, struct rusage* r_usage);
id_t是一個整數類型,它用於使用者和群組識別碼,在標頭檔sys/resource.h中定義的rusage結構用來確定當前程式已耗費了多少CPU時間,它至少包含了兩個成員:
rusage成員                             說明
struct timeval ru_utime        使用的使用者時間
struct timeval ru_stime        使用的系統時間
一個 程式耗費的CPU時間可分為使用者時間(程式執行自身的指定所耗費的時間)和 系統時間(作業系統為程式執行所耗費的時間,即執行輸入輸出操作的系統調用或其他系統函數所花費的時間)。
每個啟動並執行程式都有一個與之關聯的優先順序,優先順序越高的程式將分配到更多的CPU可用時間。
普通使用者只能降低其程式的優先順序,而不能升高。
應用程式可以用getpriority和setpriority函數確定和更改它們的優先順序。
被優先順序函數檢查或者更改的進程可以用進程標識符、群組識別碼或使用者來確定。
which參數指定了對待who參數的方式
which參數                        說明
PRIO_PROCESS            who參數是進程標識符
PRIO_PGRP                    who參數是進程組
PRIO_USER                    who參數是使用者識別碼
因此,為確定當前進程的優先順序,可以調用
proprity = getpriority(PRIO_PROCESS, getpid());
預設的優先順序是0,正數優先順序用於後台服務,它們只在沒有其他更高優先順序的任務準備運行時才執行。負數優先順序使一個程式運行更頻繁,獲得更多的CPU可用時間。優先順序的有效範圍是-20~20.數值越高優先順序越低。
編寫程式limits.c
4.9    小結在本章中,瞭解了linux環境,並對程式啟動並執行條件進行了研究,學習了命令列參數和環境變數,它們都能用來改變程式的預設行為,並提供有用的程式選項
還介紹了程式怎樣利用庫函數來處理日期和時間值,獲得自身、使用者以及它運行之上的電腦的相關資訊。
因為linux程式通常要共用主機上的寶貴資源,所以本身也對如何確定和管理資源的問題做了介紹。

linux程式設計——linux環境(第四章)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.