C語(yǔ)言中操作utmp文件的相關(guān)函數(shù)用法
C語(yǔ)言getutent()函數(shù):從utmp文件中取得賬號(hào)登錄數(shù)據(jù)
頭文件:
#include <utmp.h>
定義函數(shù):
struct utmp *getutent(void);
函數(shù)說(shuō)明:getutent()用來(lái)從utmp 文件(/var/run/utmp)中讀取一項(xiàng)登錄數(shù)據(jù), 該數(shù)據(jù)以u(píng)tmp 結(jié)構(gòu)返回. 第一次調(diào)用時(shí)會(huì)取得第一位用戶數(shù)據(jù), 之后每調(diào)用一次就會(huì)返回下一項(xiàng)數(shù)據(jù), 直到已無(wú)任何數(shù)據(jù)時(shí)返回NULL。
utmp 結(jié)構(gòu)定義如下:
struct utmp
{
short int ut_type; //登錄類(lèi)型
pid_t ut_pid; //login 進(jìn)程的pid
char ut_line[UT_LINESIZE]; //登錄裝置名, 省略了"/dev/"
char ut_id[4]; //Inittab ID
char ut_user[UT_NAMESIZE]; //登錄賬號(hào)
char ut_host[UT_HOSTSIZE]; //登錄賬號(hào)的遠(yuǎn)程主機(jī)名稱
struxt exit_status ut_exit; //當(dāng)類(lèi)型為DEAD_PROCESS 時(shí)進(jìn)程的結(jié)束狀態(tài)
long int ut_session; //Sessioc ID
struct timeval ut_tv; //時(shí)間記錄
int32_t ut_addr_v6[4]; //遠(yuǎn)程主機(jī)的網(wǎng)絡(luò)地址
char __unused[20]; //保留未使用
};
ut_type 有以下幾種類(lèi)型:
- EMPTY:此為空的記錄.
- RUN_LVL:記錄系統(tǒng)run-level 的改變
- BOOT_TIME:記錄系統(tǒng)開(kāi)機(jī)時(shí)間
- NEW_TIME:記錄系統(tǒng)時(shí)間改變后的時(shí)間
- OLD_TINE:記錄當(dāng)改變系統(tǒng)時(shí)間時(shí)的時(shí)間.
- INIT_PROCESS:記錄一個(gè)由init 衍生出來(lái)的進(jìn)程.
- LOGIN_PROCESS:記錄 login 進(jìn)程.
- USER_PROCESS:記錄一般進(jìn)程.
- DEAD_PROCESS:記錄一結(jié)束的進(jìn)程.
- ACCOUNTING:目前尚未使用.
exit_status 結(jié)構(gòu)定義:
struct exit_status
{
short int e_termination; //進(jìn)程結(jié)束狀態(tài)
short int e_exit; //進(jìn)程退出狀態(tài)
};
timeval 的結(jié)構(gòu)定義請(qǐng)參考gettimeofday()。
相關(guān)常數(shù)定義如下:
- UT_LINESIZE 32
- UT_NAMESIZE 32
- UT_HOSTSIZE 256
返回值:返回 utmp 結(jié)構(gòu)數(shù)據(jù), 如果返回NULL 則表示已無(wú)數(shù)據(jù), 或有錯(cuò)誤發(fā)生.
附加說(shuō)明:getutent()在第一次調(diào)用時(shí)會(huì)打開(kāi)utmp 文件, 讀取數(shù)據(jù)完畢后可使用endutent()來(lái)關(guān)閉該utmp文件.
范例
#include <utmp.h>
main()
{
struct utmp *u;
while((u = getutent()))
{
if(u->ut_type == USER_PROCESS)
printf("%d %s %s %s \n", u->ut_type, u->ut_user, u->ut_line, u->ut_host);
}
endutent();
}
執(zhí)行
//表示有三個(gè)root 賬號(hào)分別登錄/dev/pts/0, /dev/pts/1, /dev/pts/2
7 root pts/0
7 root pts/1
7 root pts/2
C語(yǔ)言setutent()函數(shù):從頭讀取utmp文件中的登錄數(shù)據(jù)
頭文件:
#include <utmp.h>
定義函數(shù):
void setutent(void);
函數(shù)說(shuō)明:setutent()用來(lái)將getutent()的讀寫(xiě)地址指回utmp 文件開(kāi)頭。
C語(yǔ)言endutent()函數(shù):關(guān)閉文件(關(guān)閉utmp文件)
頭文件:
#include <utmp.h>
定義函數(shù):
void endutent(void);
函數(shù)說(shuō)明:endutent()用來(lái)關(guān)閉由getutent 所打開(kāi)的utmp 文件。
范例:請(qǐng)參考getutent().
相關(guān)文章
C語(yǔ)言詳解格式控制符scanf與printf的輸入輸出
這篇文章主要介紹了C語(yǔ)言格式控制符中輸入scanf()和輸出printf()的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2022-04-04
C語(yǔ)言求字符串長(zhǎng)度的四種方法實(shí)例代碼
在C語(yǔ)言的應(yīng)用過(guò)程中經(jīng)常性的會(huì)用到字符串,以及對(duì)字符串的長(zhǎng)度進(jìn)行計(jì)算的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言求字符串長(zhǎng)度的四種方法的相關(guān)資料,需要的朋友可以參考下2022-12-12
C++實(shí)現(xiàn)公司人事管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)公司人事管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
用C語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的虛擬機(jī)
這篇文章主要介紹了用C語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的虛擬機(jī),其中棧數(shù)組的部分非常值得學(xué)習(xí),需要的朋友可以參考下2015-07-07
關(guān)于C/C++中的side effect(負(fù)效應(yīng))和sequence point(序列點(diǎn))
不知你在寫(xiě)code時(shí)是否遇到這樣的問(wèn)題?int i = 3; int x = (++i) + (++i) + (++i); 問(wèn)x值為多少?進(jìn)行各種理論分析,并在編譯器上實(shí)踐,然而可能發(fā)現(xiàn)最終的結(jié)果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會(huì)產(chǎn)生不同的結(jié)果。這讓人很頭疼2013-10-10
C++ abs函數(shù)實(shí)際應(yīng)用詳解
本文我們來(lái)講C++的abs函數(shù)以及實(shí)戰(zhàn)運(yùn)用,C++中的abs函數(shù)。在C++中使用abs函數(shù)要注意存在兩種版本,一種是在stdlmb.h中定義的版本,另一個(gè)是在cmath頭文件中定義的。夷實(shí)上在stdlib.h文件是C的函數(shù),而cmath中的是C++版本2022-08-08
C語(yǔ)言設(shè)置和取得socket狀態(tài)的相關(guān)函數(shù)用法
這篇文章主要介紹了C語(yǔ)言設(shè)置和取得socket狀態(tài)的相關(guān)函數(shù)用法,分別是setsockopt()函數(shù)和getsockopt()函數(shù)的使用介紹,需要的朋友可以參考下2015-09-09
C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(倒置鏈表之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言中結(jié)構(gòu)體偏移及結(jié)構(gòu)體成員變量訪問(wèn)方式的問(wèn)題討論
這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體偏移及結(jié)構(gòu)體成員變量訪問(wèn)方式的問(wèn)題討論,幫助大家理解struct的成員變量偏移,需要的朋友可以參考下2016-05-05

