前言:怎麼感受Linux運維和Linux系統實驗沒什麼關係?該不會的仍是不會(@@)。記錄一下幾個實驗吧。html
本篇目錄:linux
實驗一 編程環境編程
實驗二 文件讀寫bash
實驗三 進程通訊運維
實驗步驟1:在Linux操做系統中編寫一個程序,實如今bash中的輸出「Hello World」。編輯器
(1) 在命令終端中輸入touch test.sh命令,以建立一個bash腳本函數
(2) 在編輯器中打開test.sh,並輸入如下代碼並保存工具
(3) 接着在終端輸入 ./test.sh 以運行bash腳本測試
實驗步驟2:編寫一個程序輸入一組數據,輸出該數據的平均值。(要有頭文件,有AVE函數的聲明)spa
(1) 創建AVE.c和AVE.h頭文件以及main.c文件
AVE.c
AVE.h
main.c
(2) 在終端中輸入gcc -o hello main.c AVE.c進行編譯,在當前目錄生成hello可執行文件,運行./hello來查看運行結果。
實驗步驟3:將步驟2中求平均值得函數AVE打包生成一個動態庫和靜態庫,並在main.c中調用。
相關知識資料:
http://www.javashuo.com/article/p-nhskwnkt-bv.html
http://www.javashuo.com/article/p-brmiuieh-ch.html
https://www.jianshu.com/p/dbe848e4ad0d
(1) 分別創建目標文件SAVE.c,SAVE.h(靜態庫)和DAVE.c,DAVE.h(動態庫)且內容與AVE.c和AVE.h相同。
SAVE.c和SAVE.h
DAVE.c和DAVE.h
(2) 建立靜態庫.a及在main.c中調用
1.先將SAVE.c編譯生成.o文件
gcc -c -o SAVE.o SAVE.c
2.經過ar工具將目標文件打包成靜態庫文件.a
ar -rc libSAVE.a SAVE.o
3.編譯main.c時加入libSAVE.a
gcc SAVE.h main.c -static -L. -lSAVE -o main_static
4.執行main_static
(3) 建立動態庫.so及在main.c中調用
1.將DAVE.c生成動態連接庫
gcc -fPIC -shared DAVE.c -o libDAVE.so
2.編譯main.c時加入libDAVE.so
gcc DAVE.h main.c -L. -lDAVE -o main_shared
3.將文件 libhelloworld.so複製到目錄/usr/lib中
sudo cp libDAVE.so /usr/lib
4.運行./main_shared
實驗步驟4:編寫上述兩個程序的makefile文件,經過make命令進行編譯。
相關知識資料:
https://blog.csdn.net/qq_35451572/article/details/81092902
(1) 在源代碼目錄下編寫Makefile文件
注意:
輸入: make all --- 生成libcalc.a,libshow.so庫和main可執行程序
make lib --- 生成libcalc.a,libshow.so庫
make clean --- 清除目標文件
輸入: export LD_LIBRARY_PATH=`pwd` 添加當前路徑到動態庫路徑環境變量LD_LIBRARY_PATH
輸入: ./main 測試結果.
實驗步驟1:編寫一個程序,調用時帶兩個參數。程序運行後在文件所在目錄有名爲參數1的文件,而且文件內容是參數2.(考驗帶參數的main函數和文件讀寫)
相關知識資料:
http://www.javashuo.com/article/p-bpncgwpy-nn.html
1.編寫C程序CreateWrite.c
#include<stdio.h> #include<stdlib.h> void main(int argc,char** argv)//argc表示入參個數,argv存儲全部入參 { FILE *fp; if((fp=fopen(argv[1],"wb"))==NULL){ printf("\nopen file Fail,close!"); getchar(); exit(1); } fputs(argv[2],fp); fclose(fp); }
2.編譯運行
gcc -c CreateWrite.c gcc -o test CreateWrite.o ./test haha heihei
實驗步驟1:編寫一個程序,實現父子進程間的通訊。要求:父進程每一個人3s向子進程發送並打印一條「Hello-n」消息,n從0開始遞增。子進程接收父進程消息就打印這條消息。(程序當按下Ctrl+C中止)
相關知識資料:
https://blog.csdn.net/xiaokedou_hust/article/details/53312341
http://www.javashuo.com/article/p-gewsbyyp-cu.html
代碼:
#include<stdio.h> #include<unistd.h> int main() { int fd[2]; // 兩個文件描述符 pid_t pid; char buff[20]; char info[20]; int counter=0; if(pipe(fd) < 0) // 建立管道 printf("Create Pipe Error!\n"); if((pid = fork()) < 0) // 建立子進程 { printf("Fork Error!\n"); return 0; } else if(pid == 0) // 進程 { while(1){ close(fd[1]); // 關閉寫端 read(fd[0], buff, 20); printf("%s\n", buff); } } else { while(1){ close(fd[0]); // 關閉讀端 sprintf(info,"Hello-%d",counter); sleep(3); write(fd[1], info,20); counter++; } } return 0; }