1. 程式人生 > >Linux C程式設計練習(一)

Linux C程式設計練習(一)

1、定製自己的ls命令

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <time.h> void do_ls(char*dir_entry); void do_ls_filename(char*dir_entry); void do_stat( char* filename ); void show_list( char* filename, struct stat* statinfo ); void mode_to_letters( mode_t filemode, char str[] ); void show_time( time_t filetime ); char* format_time( char* dsttime, const
char* srctime ); //使用者id轉名稱 char* uid_to_name( uid_t uid ); //組id轉名稱 char* gid_to_name( gid_t gid ); int flag; int main(int argc,char*argv[]) { char*dir="."; if(argc>2) { dir=argv[3]; } //printf("%s\n",dir ); //printf("%c\n",argv[2][1] ); switch(argv[2][1]){ case
'l':flag=0;do_ls(argv[3]);break; case 'A':flag=1;do_ls(argv[3]);break; case 'n':flag=2;do_ls(argv[3]);break; case 'a':flag=3;do_ls(argv[3]);break; case 'm':flag=4;do_ls(argv[3]);break; } } void do_ls(char* dir_entry) { DIR* pDir; struct dirent* pCurDir; if( ( pDir = opendir( dir_entry ) ) == NULL ){ perror( "read dir" ); exit( -1 ); } else { while( ( pCurDir = readdir( pDir ) ) != NULL ) { //printf("%s\n",pCurDir->d_name ); do_stat( pCurDir->d_name ); } closedir( pDir ); } } //得到檔案資訊 void do_stat( char* filename ){ struct stat statinfo; if ( stat( filename, &statinfo ) == -1 ) { printf( "開啟%s失敗\n", filename ); exit( -1 ); }else { show_list( filename, &statinfo ); } } //顯示檔案列表 void show_list( char* filename, struct stat* statinfo ) { mode_t st_mode = statinfo->st_mode; char str[10]; mode_to_letters( st_mode, str ); switch(flag){ case 0:{ printf( "%s\t", str ); //檔案許可權和檔案型別資訊 printf( "%ld\t", statinfo->st_nlink ); //該檔案上硬連結個數 printf( "%s\t\t", uid_to_name( statinfo->st_uid ) ); //UID號轉使用者名稱 printf( "%s\t", gid_to_name( statinfo->st_gid ) ); //GID號轉組名 printf( "%10ld", statinfo->st_size ); //檔案大小 show_time( statinfo->st_mtime ); //最後一次修改時間 printf( "\t%s", filename ); printf( "\n" ); };break; case 1:{ printf("%s ",filename ); };break; case 2:{ printf( "%s\t", str ); //檔案許可權和檔案型別資訊 printf( "%ld\t", statinfo->st_nlink ); //該檔案上硬連結個數 printf( "%d\t\t", statinfo->st_uid ); //UID號 printf( "%d\t", statinfo->st_gid ); //GID號 printf( "%10ld", statinfo->st_size ); //檔案大小 show_time( statinfo->st_mtime ); //最後一次修改時間 printf( "\t%s", filename ); printf( "\n" ); };break; case 3: printf("%s ", filename);break; case 4: printf("%s,",filename);break; } printf("\n"); } char* uid_to_name( uid_t uid ){ return getpwuid( uid )->pw_name; } char* gid_to_name( gid_t gid ){ return getgrgid( gid )->gr_name; } void mode_to_letters( mode_t filemode, char str[] ) { strcpy( str, "----------" ); if( S_ISREG( filemode ) ) str[0] = '-'; if( S_ISDIR( filemode ) ) str[0] = 'd'; if( S_ISLNK( filemode ) ) str[0] = 'l'; //使用者許可權位 if( filemode & S_IRUSR ) str[1] = 'r'; if( filemode & S_IWUSR ) str[2] = 'w'; if( filemode & S_IXUSR ) str[3] = 'x'; //組許可權位 if( filemode & S_IRGRP ) str[4] = 'r'; if( filemode & S_IWGRP ) str[5] = 'w'; if( filemode & S_IXGRP ) str[6] = 'x'; //其他組許可權位 if( filemode & S_IROTH ) str[7] = 'r'; if( filemode & S_IWOTH ) str[8] = 'w'; if( filemode & S_IXOTH ) str[9] = 'x'; } void show_time( time_t filetime ) { struct tm* ptm; ptm = localtime( &filetime ); int month = ptm->tm_mon + 1; int day = ptm->tm_mday; int hour = ptm->tm_hour; int min = ptm->tm_min; char srchour[3] = "0"; char srcmin[3] = "0"; char dsthour[3] = "0"; char dstmin[3] = "0"; sprintf( srchour, "%d", hour ); sprintf( srcmin, "%d", min ); format_time( dsthour, srchour ); format_time( dstmin, srcmin ); printf( "%4d月%4d%4s:%2s", month, day, dsthour, dstmin ); } char* format_time( char* dsttime, const char* srctime ) { if( strlen( srctime ) < 2 ) { return strcat( dsttime, srctime ); } return strcpy( dsttime, srctime ); }

執行結果:

2、遍歷當前目錄,輸出目錄和檔案詳細資訊

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <stdlib.h>
#define MAX 102
void printdir(char*dir,int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;

    if((dp=opendir(dir))==NULL)
    {

        //fprintf(stderr,"can't not open directory:%s\n",dir);
        return;
    }

    chdir(dir);
    while((entry=readdir(dp)) != NULL)
    {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode))
        {
            if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
                continue;
            printf("%*s%s/\n",depth,"",entry->d_name);
            printdir(entry->d_name,depth+4);
        }
        else 
            printf("%*s%s\n",depth,"",entry->d_name);
    }
    closedir(dp);
}


int main()
{
    char buffer[MAX];
    char *p=getcwd(buffer,MAX);
    printf("The current directory:%s\n",buffer);
    printdir(buffer,0);
    return 0;
}

3、對文字檔案的內容進行逆序輸出,要求按行,按詞,同時按行和詞逆序三種輸出方式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024
struct node{
    char *line;
    struct node *next;
};


char* getWord(char word[]);
void read_line();
void read_word();
void read_mixture();


FILE *in, *out;
char buf[MAXSIZE];
int cnt;

int main(){
    char op;
    printf("請選擇檔案輸出形式:\n");
    printf("1、按行逆序\n");
    printf("2、按詞逆序\n");
    printf("3、混合逆序\n");
    printf("請輸入你的選擇(按q退出):");
    while(scanf("%c",&op)&&op!='q')
    {
        switch(op){
        case '1':read_line();break;
        case '2':read_word();break;
        case '3':read_mixture();break;
        }
    }
    return 0;
}


void read_line()
{
    printf("\n");
    struct node *head = (struct node*)malloc(sizeof(struct node));

    if(NULL == (in = fopen("test.txt", "r"))){
        printf("Error while open the file\n");
        //return -1;
    }

    head->next = NULL;
    while(NULL != fgets(buf, MAXSIZE, in)){
        struct node *pnode = (struct node*)malloc(sizeof(struct node));
        pnode->line = (char*)malloc(strlen(buf));
        pnode->next = NULL;

        sprintf(pnode->line, "%s", buf);
        if(NULL != head->next){
            pnode->next = head->next;
            head->next = pnode;
        }
        else{
            head->next = pnode;
        }
    }

    while(NULL != head->next){
        struct node *pnode = head->next;
        fputs(pnode->line, stdout);
        head->next = pnode->next;
        free(pnode->line);
        free(pnode);
    }
    free(head);
}

void read_word()
{
    struct node *head = (struct node*)malloc(sizeof(struct node));
    if(NULL == (in = fopen("test.txt", "r"))){
        printf("Error while open the file\n");
        //return -1;
    }

    head->next = NULL;
    while(NULL != fgets(buf, MAXSIZE, in)){
        struct node *pnode = (struct node*)malloc(sizeof(struct node));
        pnode->line = (char*)malloc(strlen(buf));
        pnode->next = NULL;

        sprintf(pnode->line, "%s", buf);
    for(int i=strlen(pnode->line);i>=0;i--)
    {
        printf("%c",(pnode->line)[i]);
    }
        if(NULL != head->next){
            pnode->next = head->next;
            head->next = pnode;
        }
        else{
            head->next = pnode;
        }
    }
    fclose(in);
    printf("\n");
}

void read_mixture()
{
    struct node *head = (struct node*)malloc(sizeof(struct node));

    if(NULL == (in = fopen("test.txt", "r"))){
        printf("Error while open the file\n");
        //return -1;
    }

    head->next = NULL;
    while(NULL != fgets(buf, MAXSIZE, in)){
        struct node *pnode = (struct node*)malloc(sizeof(struct node));
        pnode->line = (char*)malloc(strlen(buf));
        pnode->next = NULL;

        sprintf(pnode->line, "%s", buf);
        if(NULL != head->next){
            pnode->next = head->next;
            head->next = pnode;
        }
        else{
            head->next = pnode;
        }
    }

    while(NULL != head->next){
        struct node *pnode = head->next;
        head->next = pnode->next;
    for(int i=strlen(pnode->line);i>=0;i--)
    {
        printf("%c",(pnode->line)[i]);
    }
        free(pnode->line);
        free(pnode);
    }
    free(head);
    printf("\n");
}

4、建立兩個程序。父程序負責建立一個新的文字檔案,並向文字檔案中寫入資料,當資料寫入完成後,傳送訊號給子程序,子程序獨處檔案內容並顯示。

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>//perror()的標頭檔案
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#define MAXSIZE 1024
char buf[MAXSIZE];

int main(){
    //int fd=open("hello.txt",O_WRONLY);
    FILE *fp;
    int pid;
    char *hello="hello ";
    char *filename="hello.txt";
    if((fp=fopen(filename,"w+"))==NULL){
        perror("fopen");
        return -1;
    }
    if(fwrite(hello,strlen(hello),1,fp)<1)//fwrite返回成功寫入檔案的塊數
            printf("fwrite hello error!\n");
    //printf("這是父程序\n");
    fclose(fp);
    pid=fork();
    if(pid==-1){//建立程序,失敗返回-1
        perror("fork error");
        return -1;
    }
    if(pid==0){//子程序
        kill(getppid(),SIGALRM);
        fp=fopen("hello.txt","r");
        //printf("這是子程序\n");
        while(NULL != fgets(buf, MAXSIZE, fp)){
            fprintf(stdout,"%s\n",buf);
        }

    }
    //fclose(fp);
    return 0;
}

相關推薦

Linux C程式設計練習

1、定製自己的ls命令 #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <stdlib.h> #include &

C語言程式設計練習

問題描述:.給出一個英語句子,希望你把句子裡的單詞順序都翻轉過來     輸入樣例:I love you    輸出樣例:you love I  1 /**********************************************************

Linux C語言教程 資料型別

一、基礎型別 1.1 整型 整型常量的第一個字元是數字0,該常量會被視作八進位制,千萬不要為了格式對齊,將十進位制整型寫成八進位制。 1.1.2 列舉 1.2 浮點型 1.3 指標 1.3.1 字元指標 C語言是靜態弱型別語言,型別在編譯時需要確定,對於st

Linux系統操作練習

用一條命令把redhat_versionX中帶奇數的檔案複製到桌面到SINGLE中 命令如下: 效果如下: 用一條命令把redhat_versionX中帶偶數的檔案複製到/DOUBLE中 命令如下: 效果如下: 用一條命令把WESTOS_classX_linuxY中class1的檔案移動到當前使用者

C#程式設計練習03:北斗時間系統、GPS時間系統及其與UTC時間系統之間的轉換

需求說明:北斗周-周內秒轉化為日曆時,轉化為UTC時,轉化為GPS週週內秒 GPS周-周內秒轉化為日曆時,轉化為UTC時,轉化為北斗周-周內秒 設計示意圖: 原始碼: using System; using System.Collections.Generic; using S

C#程式設計練習02:大地座標系LBH向空間直角座標系XYZ的轉換及其逆轉換

需求說明:以WGS-84軟體為例,實現大地座標系(LBH)向空間直角座標系(XYZ)的轉換及其逆轉換 原理說明: 程式原始碼: using System; using System.Collections.Generic; using System.Linq; using S

C程式設計基礎

參考書籍介紹 作業系統之哲學原理() C程式設計(譚浩強) 計算機網路(謝希仁) 微機原理(清華大學出版社) 高階資料結構 C語言基本資料型別、運算子與表示式 基本型別及其所佔位元組 short(短整型) :2個儲存單位 int (整型) :4個儲存單

Flink程式設計練習

Flink程式設計練習,NYC計程車資料 環境配置 本專案參考這裡,setup。 首先確保已經下載好flink依賴,並從Github下載程式碼。 下載依賴資料,這裡依賴的是紐約出租車資料,可以使用命令列下載: wget http

linux網路程式設計基礎

 一、資料儲存順序:大端和小端          高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換       面試有時會出這麼個題:寫一個程式判

DOM程式設計練習

1、製作頁面版的資產折舊計算器。 需求:使用者在頁面上錄入資產原價、折舊率以及計算年限,單擊“計算”按鈕後,計算該資產的折舊價值並顯示在頁面上。 ==========================

C++入門練習

題目收集自Coursera《程式設計與演算法》課程,侵刪。 題目 晶晶赴約會 奇數求和 蘋果和蟲子 大象喝水 整數的個數 1的個數 最高的分數 奇偶排序 晶晶赴約會 注意: 總時間限制: 1000ms 記憶體限制: 65536kB 描述

Linux C程式練習2程序操作

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc,char **argv){

C++程式設計練習 找出100以內的素數

int i,j,n,a[101];  //對陣列賦值   for (i=1;i<=100;i++)     a[i]=i;   a[1]=0; //將非素數賦值為0。   for (i=2;i<sqrt(100);i++)     for (j=i+1;j<

小白的linux練習

探索linux練習一、用student用戶登陸系統圖形界面 2.打開一個bash 3.修改student的密碼,把密碼更新成”T3st1ngtlme”(主機字母和數字) 4.顯示當前系統時間 5.顯示當前系統時間,顯示格式為:”小時:分鐘:秒 AM/PM”(AM/PM為上下午標識) 6.顯示“/usr/bin

Linux學習之shell 程式設計基礎

一、linux中經常和正則表示式聯合使用的工具 grep sed awk(自己去研究吧). 二,以grep為例,有以下正則操作 特殊符號彙總 特殊符號 代表意義 [:alnum:] 代表英文

Linux命令列與shell指令碼程式設計大全

一、基本 bash shell命令 建立檔案 : touch 連結檔案:符號連結:是一個實實在在的檔案,兩個通過符號連結在一起的檔案,彼此的內容並不相同。使用ln -s命令。 硬連結:會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但他們從根本上而言是同一個檔案。原始檔案必須事

C學習筆記程式設計作業

C學習筆記(一)-程式設計作業 第十一週作業: [Loop]雙基迴文數 [Loop]校門外的樹 [Algorithm]約瑟夫環 [Recursion] 漢諾塔 [Algorithm]紀念郵票 [algorithm]

Java 由淺入深GUI程式設計實戰練習

專案簡介: 1.實現利用下拉選單的方式選擇傳送快捷語句; 2.實現對留言資訊內容的置頂處理以及至尾處理; 3.實現清屏處理或現實保留部分留言內容; 執行介面: 程式碼展示: import java.awt.BorderLayout; import java.awt.Button; imp

程式設計規範C/C++的命名原則

無以規矩,不成方圓。 符合規範的統一命名是程式編寫的基本規矩之一。很多時候我們不願意接手別人的程式碼,原因之一就是程式碼命名很亂;我們自己寫程式碼時經常寫到後面忘了前面,也有可能是我們沒有養成規範的命名習慣。當寫程式碼成為一種藝術的美時,這種美的最直接的體現就

PAT (Basic Level) Practice 中文C/C++練習15分整理

本文為博主練習基礎C語言時,在PTA平臺上做的簡單練習,答案僅僅能通過測試,不一定沒有錯誤。按分值順序排列。 PTA(Basic Level) Practice (中文):https://pintia.cn/problem-sets/994805260223102976/problems