生活随笔
收集整理的這篇文章主要介紹了
操作系统实践(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??本節課的主要內容是:文件讀寫。在C語言中,我們可以使用fopen,fclose等函數進行文件操作。但下放到操作系統層次,就是一些文件的系統調用了。本節的主要內容也就是介紹下與文件相關的一些系統調用。
??我發現自己寫的,遠沒有老師提供的資料全面。所以在這里,我就直接用圖片說明內容啦~
??以上就是本節的主要理論學習內容,下面還有三個作業進行鞏固,我就把自己的答案附在上面,可能不是很簡潔,但我后面會慢慢的進行修改完善滴~
一、練習一:
#include
<stdio
.h
>
int
main(int argc
, char
*argv
[]) {for (int i
=1; i
<argc
; i
++) {printf("%s ", argv
[i
];printf("%c ", *(argv
[i
]));}printf("\n");
}
??寫這個的時候,遇到這樣一個直接的問題:不定參數如何輸入?原來在main函數中,它的參數列表就可以作為它的不定輸入。設定argc和argv。其中argc代表輸入參數個數,argv代表輸入參數內容。更為詳細的內容的可以參考:https://www.cnblogs.com/x_wukong/p/5326557.html
??還有就是,輸出的時候會出現一種這樣的情況:輸出的最后總是有個%,這是怎么回事呢?其實這個就是Linux下一個習慣,提示輸出到了最后。如果不想要的話,可以在最后增加一個換行符(這個問題困擾了我很久,感謝https://segmentfault.com/q/1010000004687388)
二、練習二:
??思路:因為文件內內容長度的不確定性,不想數據庫那樣有嚴格的結構體。這里利用read讀文件如果到文件底會返回0做判斷,同時read返回值就是文件讀出來的字節count改變偏移量offset。以offset作為lseek偏移數,不斷累加,進行讀取。源碼如下:
#include
<fcntl
.h
>
#include
<unistd
.h
>
#include
<stdio
.h
>
#include
<string
.h
>
#include
<stdlib
.h
>
void panic(char
*message
) {perror(message
);exit(EXIT_FAILURE);
}int fd
;struct record
{char content
[100];
};
void db_open(char
*path
) {mode_t mode
= 0777;fd
= open(path
, O_RDWR | O_APPEND | O_CREAT, mode
);if (fd
< 0)panic("open");
}
void db_close() {close(fd
);
}
void db_dump() {int offset
= 0;while (1) {lseek(fd
, offset
, SEEK_SET);struct record record
;int count
= read(fd
, &record
, 100);if (count
== 0)break;else {offset
+= count
;printf("%s\n", record
.content
);}}
}int
main(int argc
, char
*argv
[]) {db_open(argv
[1]);db_dump();db_close();return 0;
}
??效果圖如下:
三、練習三:
??思路:讀取文件部分與問題二一致,同時增加寫文件部分,文件名為第二個傳入的參數值。源代碼如下(代碼是有問題的,問題在下面說):
#include
<fcntl
.h
>
#include
<unistd
.h
>
#include
<stdio
.h
>
#include
<string
.h
>
#include
<stdlib
.h
>
void panic(char
*message
) {perror(message
);exit(EXIT_FAILURE);
}int fd_source
;
int fd_target
;struct record
{char content
[100];
};
void db_open_source(char
*path
) {mode_t mode
= 0777;fd_source
= open(path
, O_RDWR | O_APPEND | O_CREAT, mode
);if (fd_source
< 0)panic("open_source");
}
void db_open_target(char
*path
) {mode_t mode
= 0777;fd_target
= open(path
, O_RDWR | O_APPEND | O_CREAT, mode
);if (fd_target
< 0)panic("open_target");
}void db_close() {close(fd_source
);close(fd_target
);
}
void db_append(char
*content
) {struct record record
;strcpy(record
.content
, content
);int count
= write(fd_target
, &record
, 100);if (count
< 0)panic("write");
}
void db_dump() {int offset
= 0;int num
= 0;while (1) {lseek(fd_source
, offset
, SEEK_SET);struct record record
;int count
= read(fd_source
, &record
, sizeof(record
));if (count
== 0)break;else {offset
+= count
;db_append(record
.content
);printf("%s", record
.content
);}}printf("\n");
}int
main(int argc
, char
*argv
[]) {db_open_source(argv
[1]);db_open_target(argv
[2]);db_dump();db_close();return 0;
}
??問題:這個代碼在執行的時候,在終端輸出的是沒有問題的。但寫入到目標文件中的內容,最終會出現一行亂碼(長度恰好是100),如下圖:
??有問題是好事,等我解決了,再補充說明吧~
??呼,第二次實驗結束,繼續加油!
因作者水平有限,如有錯誤之處,請在下方評論區指出,謝謝各位!
總結
以上是生活随笔為你收集整理的操作系统实践(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。