中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

linux c模擬ls命令詳解
來源:易賢網 閱讀:1399 次 日期:2014-09-05 15:03:15
溫馨提示:易賢網小編為您整理了“linux c模擬ls命令詳解”,方便廣大網友查閱!

本篇文章是對linux中基于c模擬ls命令的實現方法進行了詳細的分析介紹,需要的朋友參考下

代碼如下:

/*

模擬ls命令,實現參數-tariRl.有些代碼重復出現,可改進

可以在該程序的基礎上增加參數,該程序思路清晰,容易擴展

*/

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<sys/types.h>

#include<unistd.h>

#include<sys/stat.h>

#include<dirent.h>

#include<sys/ioctl.h>

#include<pwd.h>

#include<grp.h>

#define LL (1<<0) /*帶l參數標志*/

#define IL (1<<1) /*帶i參數標志*/

#define RU (1<<2) /*帶R參數標志*/

#define TL (1<<16) /*帶t參數標志*/

#define AL (1<<17) /*帶a參數標志*/

#define RL (1<<18) /*帶r參數標志*/

#define LENGTH 500 /*字符串最大長度*/

#define MAX_FILE_COUNT 500/*文件列表最大長度*/

/*函數聲明*/

void error(char* error_message,int line);

void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);

int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode);

void display_simply(char (*namelist)[LENGTH],int n);

void display_LL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display_IL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display_LL_IL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display_RU(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);

void display_RU_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

void display_RU_IL(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);

void display_RU_IL_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

/*主函數*/

int main(int argc,char **argv)

{

int i,j;

/*mode的前16個位用來標志那些能影響顯示的參數,16位之后的位用來標志不影響輸出格式的參數。這個程序只用到了0-3位,16-18位,如果要在該程序的基礎上增加參數,可以用其他沒有使用的位。

mode的第0位為1表示帶l參數,mode的第1位為1表示帶i參數,mode的第2位為1表示帶R參數,mode的第16位為1表示帶t參數,mode的第17位為1表示帶a參數,mode的第18位為1表示帶r參數*/

int mode=0;

char error_message[LENGTH]={0};/*錯誤信息*/

char path[LENGTH]={0};/*路徑*/

struct stat stalist[MAX_FILE_COUNT];/*文件詳細信息數組*/

char namelist[MAX_FILE_COUNT][LENGTH];/*文件名數組*/

int flag=0;/*判斷是否指定了目錄*/

int count;/*文件個數*/

/*解析參數*/

for(i=1;i<argc;i++){

if(argv[i][0]=='-'){/*如果是選項參數*/

for(j=1;j<strlen(argv[i]);j++){

if(argv[i][j]=='l')

mode=mode|LL;

else if(argv[i][j]=='i')

mode=mode|IL;

else if(argv[i][j]=='R')

mode=mode|RU;

else if(argv[i][j]=='r')

mode=mode|RL;

else if(argv[i][j]=='a')

mode=mode|AL;

else if(argv[i][j]=='t')

mode=mode|TL;

else{

snprintf(error_message,LENGTH,"no option of %c",argv[i][j]);

error(error_message,__LINE__);

}

}

}else{/*參數為目錄或文件*/

if(flag==1)

error("can not specify more then two dir or file",__LINE__);

else

flag=1;

if(argv[i][0]!='/'){/*相對路徑*/

strcat(path,get_current_dir_name());

strcat(path,"/");

strncat(path,argv[i],strlen(argv[i]));

}else/*絕對路徑*/

strcpy(path,argv[i]);

}

}

if(flag==0)/*未指定任何目錄或文件,則使用默認當前目錄*/

strcat(path,get_current_dir_name());

/*根據mode獲取指定目錄下的文件*/

count=file_list(path,stalist,namelist,mode);

/*根據mode顯示文件*/

display(stalist,namelist,count,mode);

return 0;

}

/*獲取文件列表*/

int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode)

{

int i=0,index,j,k;

DIR *dir;

struct dirent *ptr;

char str[LENGTH];

char nametemp[LENGTH];

struct stat statemp;

if(stat(path,&stalist[0])<0){

// puts(path);

error("the specify file is not exist",__LINE__);

}

if(S_ISDIR(stalist[0].st_mode)){/*如果該路徑指向的是一個目錄*/

if((dir=opendir(path))==NULL){/*打開目錄*/

sprintf(str,"can not open %s",path);

error(str,__LINE__);

}

chdir(path);/*改變當前工作目錄到path*/

i=0;

while((ptr=readdir(dir))!=NULL){/*依次讀取目錄下的所有文件*/

if(ptr->d_name[0]=='.' && !(mode & AL))/*忽略隱藏文件*/

continue;

/*按字母順序插入到stalist數組及namelist數組*/

for(j=i;j>0;j--){

if(strcmp(ptr->d_name,namelist[j-1])>0)

break;

}

for(k=i;k>j;k--){

strcpy(namelist[k],namelist[k-1]);

stalist[k]=stalist[k-1];

}

strcpy(namelist[j],ptr->d_name);

stat(ptr->d_name,&stalist[j]);

i++;

if(i==MAX_FILE_COUNT)

error("file count beyond MAX_FILE_COUNT",__LINE__);

}

closedir(dir);

}else{

j=strlen(path)-1;

while(j>=0 && path[j]!='/'){

j--;

}

if(j<0)

error("path error",__LINE__);

j++;

k=0;

while(path[j]){

namelist[0][k]=path[j];

j++;

k++;

}

namelist[0][k]=0;

return 1;

}

if(mode & TL){/*按文件修改時間排序*/

for(j=0;j<i;j++){

index=j;

for(k=j+1;k<i;k++)

if(stalist[index].st_mtime<stalist[k].st_mtime){

index=k;

}

statemp=stalist[j];

stalist[j]=stalist[index];

stalist[index]=statemp;

strcpy(nametemp,namelist[j]);

strcpy(namelist[j],namelist[index]);

strcpy(namelist[index],nametemp);

}

}

if(mode & RL){/*反序排列*/

for(j=0;j<i/2;j++){

strcpy(nametemp,namelist[j]);

strcpy(namelist[j],namelist[i-j-1]);

strcpy(namelist[i-j-1],nametemp);

statemp=stalist[j];

stalist[j]=stalist[i-j-1];

stalist[i-j-1]=statemp;

}

}

return i;

}

/*根據mode選擇不同的函數進行顯示*/

void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)

{

/*使mode的高16位為0*/

int m = mode & ((1<<16)-1);

switch(m){

case 0:

display_simply(namelist,n);

break;

case 1:

display_LL(stalist,namelist,n);

break;

case 2:

display_IL(stalist,namelist,n);

break;

case 3:

display_LL_IL(stalist,namelist,n);

break;

case 4:

display_RU(stalist,namelist,n,mode);

break;

case 5:

display_RU_LL(stalist,namelist,n,mode);

break;

case 6:

display_RU_IL(stalist,namelist,n,mode);

break;

case 7:

display_RU_IL_LL(stalist,namelist,n,mode);

break;

}

}

/*不帶顯示選項,簡單顯示文件名*/

void display_simply(char (*namelist)[LENGTH],int n)

{

int i,maxlength=0,cols;

struct winsize ts;

for(i=0;i<n;i++)

if(strlen(namelist[i])>maxlength)

maxlength=strlen(namelist[i]);

/*獲取終端的大小*/

ioctl(STDIN_FILENO,TIOCGWINSZ,&ts);

cols=ts.ws_col;

cols/=(maxlength+1);

//lines=ts.ws_row;

for(i=0;i<n;i++){

if(i!=0 && i%cols==0)

puts("");

printf("%*s",-(maxlength+1),namelist[i]);

}

putchar('n');

}

/*-l 參數,顯示詳細文件信息*/

void display_LL(struct stat * stalist,char (*namelist)[LENGTH],int n)

{

int i,mode;

char* str;

for(i=0;i<n;i++){

mode=stalist[i].st_mode;

if(S_ISDIR(mode))

printf("d");

else

printf("-");

if(mode & (1<<8))

printf("r");

else

printf("-");

if(mode & (1<<7))

printf("w");

else

printf("-");

if(mode & (1<<6))

printf("x");

else

printf("-");

if(mode & (1<<5))

printf("r");

else

printf("-");

if(mode & (1<<4))

printf("w");

else

printf("-");

if(mode & (1<<3))

printf("x");

else

printf("-");

if(mode & (1<<2))

printf("r");

else

printf("-");

if(mode & (1<<1))

printf("w");

else

printf("-");

if(mode & (1<<0))

printf("x");

else

printf("-");

printf(" %-3d",stalist[i].st_nlink);

printf(" %-6s",getpwuid(stalist[i].st_uid)->pw_name);

printf(" %-6s",getgrgid(stalist[i].st_gid)->gr_name);

printf(" %-10d",stalist[i].st_size);

str=ctime(&stalist[i].st_mtime);

str[strlen(str)-2]=0;

printf(" %s",str);

printf(" %sn",namelist[i]);

}

}

/*-i 參數,顯示文件名及節點號*/

void display_IL(struct stat* stalist,char (*namelist)[LENGTH],int n)

{

int i,maxlength=0,cols;

struct winsize ts;

for(i=0;i<n;i++)

if(strlen(namelist[i])>maxlength)

maxlength=strlen(namelist[i]);

/*獲取終端的大小*/

ioctl(STDIN_FILENO,TIOCGWINSZ,&ts);

cols=ts.ws_col;

cols/=(maxlength+9);

//lines=ts.ws_row;

for(i=0;i<n;i++){

if(i!=0 && i%cols==0)

puts("");

printf("%-8d ",stalist[i].st_ino);

printf("%*s",-(maxlength+1),namelist[i]);

}

putchar('n');

}

/*-li 參數,顯示詳細文件信息和節點號*/

void display_LL_IL(struct stat * stalist,char (*namelist)[LENGTH],int n)

{

int i,mode;

char* str;

for(i=0;i<n;i++){

printf("%-8d ",stalist[i].st_ino);

mode=stalist[i].st_mode;

if(S_ISDIR(mode))

printf("d");

else

printf("-");

if(mode & (1<<8))

printf("r");

else

printf("-");

if(mode & (1<<7))

printf("w");

else

printf("-");

if(mode & (1<<6))

printf("x");

else

printf("-");

if(mode & (1<<5))

printf("r");

else

printf("-");

if(mode & (1<<4))

printf("w");

else

printf("-");

if(mode & (1<<3))

printf("x");

else

printf("-");

if(mode & (1<<2))

printf("r");

else

printf("-");

if(mode & (1<<1))

printf("w");

else

printf("-");

if(mode & (1<<0))

printf("x");

else

printf("-");

printf(" %-3d",stalist[i].st_nlink);

printf(" %-6s",getpwuid(stalist[i].st_uid)->pw_name);

printf(" %-6s",getgrgid(stalist[i].st_gid)->gr_name);

printf(" %-10d",stalist[i].st_size);

str=ctime(&stalist[i].st_mtime);

str[strlen(str)-2]=0;

printf(" %s",str);

printf(" %sn",namelist[i]);

}

}

/*-R 參數,簡單顯示所有文件,包括目錄下面的子目錄*/

void display_RU(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,count;

char path[LENGTH]={0},temp[LENGTH]={0};

struct stat sta[MAX_FILE_COUNT];

char name[MAX_FILE_COUNT][LENGTH];

puts(get_current_dir_name());

display_simply(namelist,n);

putchar('n');

strcpy(path,get_current_dir_name());

for(i=0;i<n;i++){

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)

continue;

if(S_ISDIR(stalist[i].st_mode)){

strcpy(temp,path);

strcat(path,"/");

strcat(path,namelist[i]);

count=file_list(path,sta,name,mode);

display_RU(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-Rl 參數,顯示所有文件,包括目錄下面的子目錄的詳細信息*/

void display_RU_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,count;

char path[LENGTH]={0},temp[LENGTH]={0};

struct stat sta[MAX_FILE_COUNT];

char name[MAX_FILE_COUNT][LENGTH];

puts(get_current_dir_name());

display_LL(stalist,namelist,n);

putchar('n');

strcpy(path,get_current_dir_name());

for(i=0;i<n;i++){

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)

continue;

if(S_ISDIR(stalist[i].st_mode)){

strcpy(temp,path);

strcat(path,"/");

strcat(path,namelist[i]);

count=file_list(path,sta,name,mode);

display_RU_LL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-Ri 參數,簡單顯示所有文件,包括目錄下的子目錄,及節點號*/

void display_RU_IL(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,count;

char path[LENGTH]={0},temp[LENGTH]={0};

struct stat sta[MAX_FILE_COUNT];

char name[MAX_FILE_COUNT][LENGTH];

puts(get_current_dir_name());

display_IL(stalist,namelist,n);

putchar('n');

strcpy(path,get_current_dir_name());

for(i=0;i<n;i++){

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)

continue;

if(S_ISDIR(stalist[i].st_mode)){

strcpy(temp,path);

strcat(path,"/");

strcat(path,namelist[i]);

count=file_list(path,sta,name,mode);

display_RU_IL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-Ril 參數,顯示所有文件,包括目錄下面的子目錄的詳細信息,及節點號*/

void display_RU_IL_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,count;

char path[LENGTH]={0},temp[LENGTH]={0};

struct stat sta[MAX_FILE_COUNT];

char name[MAX_FILE_COUNT][LENGTH];

puts(get_current_dir_name());

display_LL_IL(stalist,namelist,n);

putchar('n');

strcpy(path,get_current_dir_name());

for(i=0;i<n;i++){

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)

continue;

if(S_ISDIR(stalist[i].st_mode)){

strcpy(temp,path);

strcat(path,"/");

strcat(path,namelist[i]);

count=file_list(path,sta,name,mode);

display_RU_IL_LL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

//錯誤處理函數

void error(char* error_message,int line)

{

char str[5];

sprintf(str,"%d:",line);

strcat(str,error_message);

perror(str);

exit(EXIT_FAILURE);

}

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:linux c模擬ls命令詳解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
这里只有精品视频在线| 欧美成人一品| 亚欧成人在线| 国产精品久久久久久久久久久久久久 | 在线观看欧美日韩| 欧美自拍偷拍午夜视频| 国产精品麻豆成人av电影艾秋| 亚洲精品久久嫩草网站秘色| 午夜精品区一区二区三| 国产精品成av人在线视午夜片| 99re66热这里只有精品3直播| 国产精品色婷婷久久58| 久久精品一级爱片| 亚洲区欧美区| 国产精品一区在线观看| 六月天综合网| 亚洲午夜国产一区99re久久| 国产精品久久久久免费a∨| 久久青青草综合| 亚洲欧美偷拍卡通变态| 亚洲国产三级网| 国产精自产拍久久久久久| 午夜精品久久久久99热蜜桃导演| 国产精品视频一| 欧美日韩免费网站| 免费一级欧美片在线观看| 亚洲综合第一| 亚洲欧美日韩综合aⅴ视频| 欧美精品日本| 久久综合九色综合欧美就去吻| 午夜精品久久久久久99热软件| 有码中文亚洲精品| 国产日韩欧美另类| 国产精品美女午夜av| 欧美日韩视频在线一区二区| 美女国产一区| 久久久水蜜桃| 欧美在线国产精品| 欧美一级久久久| 欧美自拍偷拍午夜视频| 一区二区毛片| 亚洲深夜福利在线| 一区二区三区黄色| 亚洲在线观看免费视频| 亚洲嫩草精品久久| 翔田千里一区二区| 久久亚洲国产精品一区二区 | 国产欧美日韩一区二区三区在线观看 | 久久综合久久综合久久| 美女主播一区| 欧美先锋影音| 精品成人在线视频| 亚洲一级高清| 欧美本精品男人aⅴ天堂| 国产精品区二区三区日本| 精东粉嫩av免费一区二区三区| 亚洲国产一区二区a毛片| 亚洲午夜激情网站| 久久久久久伊人| 国产欧美婷婷中文| 亚洲性视频网址| 欧美日本高清一区| 在线观看日韩av电影| 亚洲欧美乱综合| 麻豆成人在线| 今天的高清视频免费播放成人| 亚洲一区二区精品在线| 欧美日韩精品一区| aa级大片欧美三级| 欧美日韩免费观看中文| 91久久精品国产91久久| 欧美v亚洲v综合ⅴ国产v| 一区二区在线看| 免播放器亚洲一区| 亚洲激情不卡| 欧美日本高清| 欧美一区二区视频在线| 国产欧美一区二区三区在线看蜜臀| 一本一本久久| 国产午夜精品美女视频明星a级 | 国产欧美精品va在线观看| 亚洲午夜久久久久久久久电影院| 欧美日韩精品是欧美日韩精品| 亚洲伦理一区| 国产在线拍揄自揄视频不卡99| 久热精品视频| 亚洲欧美另类综合偷拍| 黄色精品一区| 国产精品黄视频| 能在线观看的日韩av| 亚洲素人一区二区| 在线观看日韩国产| 国产欧美日韩精品丝袜高跟鞋| 久久免费视频这里只有精品| 亚洲精品日韩激情在线电影| 欧美日韩国产精品专区| 亚洲欧美综合国产精品一区| 激情综合激情| 国产一区二区三区在线播放免费观看| 久久久久欧美| 久久岛国电影| 一区二区三区免费网站| 亚洲第一免费播放区| 国产免费观看久久黄| 国产精品v亚洲精品v日韩精品| 美日韩精品免费| 欧美va天堂| 欧美精品一区二区在线观看| 欧美91精品| 欧美大色视频| 欧美日韩亚洲一区二区三区四区| 久久夜色精品国产欧美乱| 妖精成人www高清在线观看| 最新成人av在线| 亚洲人成网站色ww在线| 亚洲激情网站| 中文在线不卡| 午夜免费日韩视频| 久久久久久久久综合| 欧美电影在线播放| 国产精品国产三级国产专播精品人 | 欧美黄色免费| 欧美另类变人与禽xxxxx| 久久中文在线| 欧美日韩国产精品一区| 国产精品久久看| 国内成人自拍视频| 亚洲精品视频在线播放| 亚洲一区免费观看| 老司机一区二区三区| 欧美激情精品久久久久久变态| 欧美日韩精品在线视频| 国内精品久久久久伊人av| 亚洲精品女av网站| 久久久久欧美精品| 国产精品理论片| 亚洲大胆美女视频| 欧美一级欧美一级在线播放| 欧美激情亚洲激情| 伊人成综合网伊人222| 欧美永久精品| 欧美日韩国产a| 亚洲第一页在线| 久久精品综合一区| 国产精品一区二区三区久久| 亚洲美女视频| 欧美日韩亚洲三区| 一区二区三区高清| 欧美视频官网| 亚洲综合三区| 国产精品高潮呻吟久久av黑人| 亚洲日本一区二区| 欧美精品自拍| 亚洲激情一区二区三区| 欧美国产日韩一区二区| 一二三区精品| 国产欧美一区二区白浆黑人| 亚洲女人天堂av| 国产综合亚洲精品一区二| 欧美一二三区在线观看| 欧美人在线视频| 亚洲一区二区三区精品在线观看 | 欧美日本国产在线| 日韩视频在线一区| 欧美小视频在线| 欧美一二三视频| 日韩写真视频在线观看| 欧美日韩国产影院| 久久久91精品国产一区二区三区| 亚洲国产成人一区| 欧美午夜一区二区三区免费大片 | 国产自产女人91一区在线观看| 亚洲欧美日本精品| 国产视频综合在线| 欧美日本中文字幕| 欧美尤物巨大精品爽| 在线精品在线| 国产精品稀缺呦系列在线| 欧美福利小视频| 久久中文字幕一区| 欧美一区二区啪啪| 性欧美xxxx大乳国产app| 9久re热视频在线精品| 亚洲电影有码| 亚洲黄色毛片| 91久久精品久久国产性色也91| 极品尤物一区二区三区| 极品日韩久久| 狠狠色丁香久久综合频道| 海角社区69精品视频| 国产综合欧美| 亚洲国产高清视频| 亚洲精品国产无天堂网2021| 国产精品区免费视频| 欧美日韩免费观看一区=区三区| 老司机午夜精品视频| 欧美国产一区在线| 欧美视频在线观看 亚洲欧| 欧美性感一类影片在线播放| 国产精品久久九九|