c語言開發linux命令 c語言實現linux命令

怎么用C語言實現linux的命令

命令是查詢當前登錄的每個用戶,它的輸出包括用戶名、終端類型、登錄日期及遠程主機,在Linux系統中輸入who命令輸出如下:

創新互聯建站專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站制作、網站設計、阜新網絡推廣、小程序設計、阜新網絡營銷、阜新企業策劃、阜新品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創新互聯建站為所有大學生創業者提供阜新建站搭建服務,24小時服務熱線:18980820575,官方網址:m.kartarina.com

我們先man一下who,在幫助文檔里可以看到,who命令是讀取/var/run/utmp文件來得到以上信息的。

我們再man一下utmp,知道utmp這個文件,是二進制文件,里面保存的是結構體數組,這些數組是struct utmp結構體的。

struct utmp {

short ut_type;

pid_t ut_pid;

char ut_line[UT_LINESIZE];

char ut_id[4];

char ut_user[UT_NAMESIZE];

char ut_host[UT_HOSTSIZE];

struct {

int32_t tv_sec;

int32_t tv_usec;

} ut_tv;

/***等等***/

};

要實現who只需要把utmp文件的所有結構體掃描過一遍,把需要的信息顯示出來就可以了,我們需要的信息有ut_user、ut_line、ut_tv、ut_host。

老師給的初始代碼:who1.c運行結果如下:

需要注意的是utmp中所保存的時間是以秒和微妙來計算的,所以我們需要把這個時間轉換為我們能看懂的時間,利用命令man -k time | grep 3搜索C語言中和時間相關的函數:

經過搜索發現了一個ctime()函數,似乎可以滿足我們的需求,于是對代碼中關于時間的printf進行修改:

printf("%s",ctime(utbufp-ut_time));

編譯運行發現出來的結果雖然已經轉換成了我們能看懂的時間格式,但是很明顯這個時間是錯的:

搜索一下ut_time這個宏,發現它被定義為int32_t類型:

但是ctime()函數中要求參數的類型是time_t類型,所以重新定義一下類型,編譯運行之后,發現時間已經改成了正確的,但是發現()中的內容被換行了,猜想ctime()函數的返回值可能自動在最后補了一個字符\n:

一開始想通過\r\b來實現“退行”,但實踐后發現并不可取,最后考慮到直接修改字符串中最后一個字符為\0,讓其字符串結束,使輸出達到與系統who命令一樣的效果,即在輸出語句前添加如下代碼:

cp[strlen(cp)-1] = '\0'

最后編譯執行效果,發現解決了該問題:

雖然能看出基本上和who指令的執行結果一致,但是并非完全一樣,主要在兩點,第一是時間格式不一樣,第二個是比who執行的結果多了幾條,需要注意的是utmp中保存的用戶,不僅僅是已經登陸的用戶,還有系統的其他服務所需要的“用戶”,所以在顯出所有登陸用戶的時候,應該過濾掉其他用戶,只保留登陸用戶。我們可以通過ut_type來區別,登陸用戶的ut_type是USER_PROCESS。

先用if語句對執行結果進行過濾,效果如下:

接著解決時間格式問題,利用man命令收到了兩個非常有用的函數:localtime()和strftime(),localtime()是把從1970-1-1零點零分到當前時間系統所偏移的秒數時間轉換為本地時間,strftime()則是用來定義時間格式的,如:年-月-日,利用這兩個函數對時間進行修改后,結果顯示終于和系統中who命令一模一樣:

最終完整的代碼如下:

#include stdio.h

#include stdlib.h

#include utmp.h

#include fcntl.h

#include unistd.h

#include time.h

#define SHOWHOST

void show_time(long timeval){

char format_time[40];

struct tm *cp;

cp = localtime(timeval);

strftime(format_time,40,"%F %R",cp);

printf("%s",format_time);

}

int show_info( struct utmp *utbufp )

{

if(utbufp-ut_type == USER_PROCESS){

printf("%-8.8s", utbufp-ut_name);

printf(" ");

printf("%-8.8s", utbufp-ut_line);

printf(" ");

show_time(utbufp-ut_time);

printf(" ");

#ifdef SHOWHOST

printf("(%s)", utbufp-ut_host);

#endif

printf("\n");

}

return 0;

}

int main()

{

struct utmp current_record;

int utmpfd;

int reclen = sizeof(current_record);

if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){

perror( UTMP_FILE );

exit(1);

}

while ( read(utmpfd, current_record, reclen) == reclen )

show_info(current_record);

close(utmpfd);

return 0;

}

如何在C語言編程中調用linux系統終端下的命令

system(執行shell 命令)

相關函數 fork,execve,waitpid,popen

表頭文件 #includestdlib.h

定義函數 int system(const char * string);

函數說明 system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命令執行完后隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。

返回值 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果system()調用成功則最后會返回執行shell命令后的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。

附加說明 在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

范例 #includestdlib.h

main()

{

system(“ls -al /etc/passwd /etc/shadow”);

}

執行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

要如何在linux系統中編譯并運行c程序

linux如何編譯c程序呢,下面就讓我們來看看吧。

1、打開Linux系統,啟動shell命令終端。

2、在終端中輸入gedithelloworld.c命令并回車。

3、進入之后進行編譯,編譯好后保存并退出。

4、輸入gcchelloworld.c命令并回車,等待編譯成功。

5、輸入命令./a.out即可運行程序。

以上就是小編的分享,希望能幫助的大家。

本文名稱:c語言開發linux命令 c語言實現linux命令
文章分享:http://m.kartarina.com/article24/hgcjce.html

成都網站建設公司_創新互聯,為您提供網站改版、網站設計公司手機網站建設、網站維護、虛擬主機、微信公眾號

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營
主站蜘蛛池模板: 西西444www无码大胆| 久久午夜福利无码1000合集| 亚洲中文字幕无码av永久| 亚洲美免无码中文字幕在线| 国产精品爽爽V在线观看无码 | 亚洲av无码专区国产乱码在线观看| 无码国产精品一区二区免费式芒果| 亚洲熟妇无码AV| 熟妇人妻系列aⅴ无码专区友真希| 无码h黄动漫在线播放网站| 国产精品无码MV在线观看| 精品无码一区二区三区爱欲| 久久久久亚洲精品无码网址| 亚洲AV永久无码精品一福利| 国产产无码乱码精品久久鸭| 国产午夜无码福利在线看网站| 熟妇人妻AV无码一区二区三区| 东京热av人妻无码专区| 无码日韩人妻AV一区二区三区 | 亚洲av极品无码专区在线观看| 亚洲精品无码你懂的网站| 亚洲中文无码永久免费| 亚洲AV无码久久精品成人| 国产日产欧洲无码视频无遮挡| 日韩成人无码一区二区三区| 亚洲最大中文字幕无码网站| 亚洲av无码专区在线播放| 亚洲精品无码乱码成人| a级毛片无码免费真人久久| 国产精品国产免费无码专区不卡| 人妻丰满熟妇AV无码区免| 亚洲熟妇av午夜无码不卡| 97性无码区免费| 亚洲精品无码av片| 亚洲性无码AV中文字幕| 无码人妻一区二区三区免费手机| 毛片免费全部播放无码| 麻豆亚洲AV永久无码精品久久| 无码人妻视频一区二区三区| 久久青青草原亚洲av无码app| AV无码久久久久不卡蜜桃|