1. 程式人生 > >2017-2018-1 20155330 《信息安全系統設計基礎》課堂測試&課下作業

2017-2018-1 20155330 《信息安全系統設計基礎》課堂測試&課下作業

arm 基本 發送 系統 ase ner 存在 image 包含

2017-2018-1 20155330 《信息安全系統設計基礎》課堂測試&課下作業

stat命令的實現-mysate

  • 學習使用stat(1),並用C語言實現
  • 提交學習stat(1)的截圖
  • man -k ,grep -r的使用
  • 偽代碼
  • 產品代碼 mystate.c,提交碼雲鏈接
  • 測試代碼,mystat 與stat(1)對比,提交截圖

STAT(1)學習

  • 使用man 1 stat命令查看
    技術分享圖片
  • 使用man -k stat | grep 2查找相關函數
    技術分享圖片
  • man 2 stat查看stat函數
    技術分享圖片
  • 產品代碼
#include <sys/types.h>

#include <sys/stat.h>

#include <time.h>

#include <stdio.h>

#include <stdlib.h>



int main(int argc, char *argv[])

       {

           struct stat sb;



           if (argc != 2) {

               fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);

               exit(EXIT_FAILURE);

           }



           if (stat(argv[1], &sb) == -1) {

               perror("stat");

               exit(EXIT_FAILURE);

           }



           printf("File type:                ");



           switch (sb.st_mode & S_IFMT) {

           case S_IFBLK:  printf("block device\n");            break;

           case S_IFCHR:  printf("character device\n");        break;

           case S_IFDIR:  printf("directory\n");               break;

           case S_IFIFO:  printf("FIFO/pipe\n");               break;

           case S_IFLNK:  printf("symlink\n");                 break;

           case S_IFREG:  printf("regular file\n");            break;

           case S_IFSOCK: printf("socket\n");                  break;

           default:       printf("unknown?\n");                break;

           }



           printf("I-node number:            %ld\n", (long) sb.st_ino);



           printf("Mode:                     %lo (octal)\n",

                   (unsigned long) sb.st_mode);



           printf("Link count:               %ld\n", (long) sb.st_nlink);

           printf("Ownership:                UID=%ld   GID=%ld\n",

                   (long) sb.st_uid, (long) sb.st_gid);



           printf("Preferred I/O block size: %ld bytes\n",

                   (long) sb.st_blksize);

           printf("File size:                %lld bytes\n",

                   (long long) sb.st_size);

           printf("Blocks allocated:         %lld\n",

                   (long long) sb.st_blocks);



           printf("Last status change:       %s", ctime(&sb.st_ctime));

           printf("Last file access:         %s", ctime(&sb.st_atime));

           printf("Last file modification:   %s", ctime(&sb.st_mtime));



           exit(EXIT_SUCCESS);

       }
  • 實現mystat.c,與stat命令比對如圖
    技術分享圖片

程序運行

  • 理解test.c, 說出程序功能
  • 編譯運行程序,提交運行截圖

TEST

  • test.c代碼
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

main()
{
    int fd;
    int newfd;
    char line[100];
    fgets(line,100,stdin);
    printf("%s",line);
    fgets(line,100,stdin);
    printf("%s",line);
    fgets(line,100,stdin);
    printf("%s",line);
    fd=open("data",O_RDONLY);
    newfd=dup2(fd,0);
    if(newfd!=0)
    {
        fprintf("stderr","Could not duplicate fd to 0\n");
        exit(1);
    }
    close(fd);
    fgets(line,100,stdin);
    printf("%s",line);
    fgets(line,100,stdin);
    printf("%s",line);
    fgets(line,100,stdin);
    printf("%s",line);
}
  • data文件內容
20155330
hello
world
  • *test.c功能:從文件描述符讀取數據,將標準輸入定向到文件。
    • 初始狀態:系統中采用的是典型的設置---三種標準流被連接到終端設備上:輸入的數據流經過文件描述符0,輸出的標準流經過文件描述符1,2。
    • 其次:關閉(0)即將標準輸入的連接掛斷則當前文件描述符數組的第一個元素現在處於空閑狀態。
    • 最後:使用開放(文件名,O_RDONLY)打開一個想連到標準輸入上的文件根據最低可用描述符原則,打開的文件被連接到標準輸入上。
  • 運行截圖
    技術分享圖片

課下作業——IPC

研究Linux下IPC機制:原理,優缺點,每種機制至少給一個示例,提交研究博客的鏈接

共享內存

  • 采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝。對於像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而共享內存則只拷貝兩次數據[1]:一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,並不總是讀寫少量數據後就解除映射,有新的通信時,再重新建立共享內存區域。而是保持共享區域,直到通信完畢為止,這樣,數據內容一直保存在共享內存中,並沒有寫回文件。共享內存中的內容往往是在解除映射時才寫回文件的。因此,采用共享內存的通信方式效率是非常高的。
  • 示例
    技術分享圖片

管道

  • 管道是Linux支持的最初Unix IPC形式之一,具有以下特點:
    • 管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;
    • 只能用於父子進程或者兄弟進程之間(具有親緣關系的進程);
    • 單獨構成一種獨立的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。
    • 數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。
  • 缺點:管道只能在本地計算機中使用,而不可用於網絡間的通信。
  • 示例
    技術分享圖片

    FIFO

  • 管道應用的一個重大限制是它沒有名字,因此,只能用於具有親緣關系的進程間通信,在有名管道(named pipe或FIFO)提出後,該限制得到了克服。FIFO不同於管道之處在於它提供一個路徑名與之關聯,以FIFO的文件形式存在於文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間),因此,通過FIFO不相關的進程也能交換數據。值得註意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。
  • 示例
    技術分享圖片

    信號

  • 信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麽時候到達。
  • 信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展後,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。
  • 信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發送信號的系統函數是kill, raise, alarm和setitimer以及sigqueue函數,軟件來源還包括一些非法運算等操作。
  • 示例:信號阻塞及信號集操作。
    技術分享圖片

    消息隊列

  • 系統V消息隊列是隨內核持續的,只有在內核重起或者顯示刪除一個消息隊列時,該消息隊列才會真正被刪除。因此系統中記錄消息隊列的數據結構(struct ipc_ids msg_ids)位於內核中,系統中的所有消息隊列都可以在結構msg_ids中找到訪問入口。
  • 消息隊列就是一個消息的鏈表。每個消息隊列都有一個隊列頭,用結構struct msg_queue來描述。隊列頭中包含了該消息隊列的大量信息,包括消息隊列鍵值、用戶ID、組ID、消息隊列中消息數目等等,甚至記錄了最近對消息隊列讀寫進程的ID。讀者可以訪問這些信息,也可以設置其中的某些信息。
  • 示例
    技術分享圖片

2017-2018-1 20155330 《信息安全系統設計基礎》課堂測試&課下作業