實驗2 linux下基本程式設計
一、實驗目的
1.掌握vim編譯器
2.掌握gcc編譯器的使用
3.了解fork()程式
二、實驗工具與裝置
1.實驗裝置:計算機(帶cd-rom)一台。
三、實驗預備知識
1. vim的編輯器
vim有三種模式:命令模式、插入模式、最後行模式。
命令模式:
剛啟動vim後,就處於該模式。在此模式下,允許用vim的子命
x命令:刪除游標上面的字元。
方向鍵:移動游標。
i命令:進入插入模式,可在當前游標處插入字元。
a命令:進入插入模式,可在當前游標後插入字元。
r命令:從當前游標處開始替換文字。
r命令:替換當前游標處字元。
~命令:對當前游標處字母進行大小寫轉換。
dd命令:刪除游標所在行。
dw命令:刪除游標所在處字。
h命令:游標左移。
l命令:游標右移。
k命令:游標上移。
j命令:游標下移。
:命令:進入最後一行模式。
插入模式:
此模式下允許輸入文字,用回車鍵換行,esc 進入命令模式。
最後一行模式:
w命令:將檔案存檔,但不退出。
wq命令:將檔案存檔,並退出。
q! 命令:不儲存檔案並退出。
r命令:將另乙個檔案內容插入當前游標處。
2.gcc編譯器
unix 上使用的c 語言編譯器cc,在linux上的派生就是gcc。在使用vim編寫完源程
序之後,返回到shell下面,使用gcc對源程式進行編譯的命令是:
gcc 源程式
其中,「源程式」即為你編寫的以.c 為副檔名的c 語言源**檔案。
如果源**沒有語法錯誤,使用以上命令編譯,會在當前目錄下生成乙個名為a.out
的可執行檔案。如果源**有語法錯誤,則不會生成任何檔案,gcc編譯器會在shell中
提示你錯誤的地點和型別。
也可以使用以下方法編譯源**檔案,生成自命名的可執行檔案:
gcc 原始檔–o 自命名的檔名
執行當前目錄下的編譯生成的可執行檔案,使用以下格式:
./可執行檔名
3.fork() 函式說明
pid_t fork(void)
fork()會產生乙個新的子程序。該函式包含於標頭檔案unistd.h 中。其子程序會複製
父程序的資料與堆疊空間,並繼承父程序的使用者**、組**、環境變數、已開啟的文
件**、工作目錄和資源限制等。linux 使用copy-on-write(cow)技術,只有當其中一
程序試圖修改欲複製的空間時才會做真正的複製動作,由於這些繼承的資訊是複製而
來,並非指相同的記憶體空間,因此子程序對這些變數的修改和父程序並不會同步。此
外,子程序不會繼承父程序的檔案鎖定和未處理的訊號。注意,linux不保證子程序會比
父程序先執行或晚執行,因此編寫程式時要留意死鎖或競爭條件的發生。
返回值,如果fork()呼叫成功則在父程序會返回新建立的子程序**(pid),而在新
建立的子程序中則返回0。如果fork() 失敗則直接返回-1,失敗原因存於errno中。失
敗的原因有三個:
1) 系統記憶體不夠;
2) 程序表滿(容量一般為200~400);
3) 使用者的子程序太多(一般不超過25個)。
錯誤**:eagain 記憶體不足;enomem 記憶體不足,無法配置核心所需的資料結構空
間。四、實驗內容和步驟
實驗一:
在linux環境下,用c語言程式設計,使用系統呼叫fork建立程序多個子程序。
(1)在終端裡輸入vim a.c,啟動vi.
(2)按a或者i進入插入模式,在裡面輸入以下**。
#include "stdio.h"
#include "sys/types.h"
#include "unistd.h"
int main()
pid_t pid1;
pid_t pid2;
pid1 = fork();
pid2 = fork();
printf("pid1:%d, pid2:%d\n", pid1, pid2);
(3)按esc鍵進入命令模式,輸入:和wq 進行儲存退出vim.
(4)用gcc編譯器編譯該程式: gcc –o a a.c –ggdb
(5)執行剛剛編譯的程式:./a
要求:a. 請說出執行這個程式後,將一共執行幾個程序。
b. 觀察執行結果,並給出分析與解釋。
這個程式執行後,一共將執行4個程序。這4個程序並沒有嚴格的區分先後順序。
剛開始未執行fork()函式時,父程序的pid1和pid2均為0,執行第乙個fork()函式時,複製父程序得到乙個子程序f1,f1的pid1和pid2均為0,父程序的pid1=f1的id;
執行第二個fork()函式時,繼續複製父程序得到子程序f2,則父程序的pid1=f1的id,pid2=f2的id,f2的pid1=f1的id,f2的pid2=0;
複製程序f1得到程序f11,則f1的pid1=0,f1的pid2=f11的id,f11的pid1和pid2均為0;
實驗二:
首先分析一下**執行時其輸出結果有哪幾種可能性,按照實驗1步驟編譯除錯觀察其實際輸出情況,比較兩者的差異,分析其中的原因。
void main (void)
{ int x=5;
if( fork( ) )
x+=30;
printf (「%d\n」,x);
else
printf(「%d\n」,x);
printf((「%d\n」,x);
(寫出可能的實驗結果及其分析說明)
可能的輸出結果:
1.35 5 35 5父程序執行if語句裡的printf然後子程序執行else語句裡的printf,父程序執行最後乙個printf,子程序執行最後乙個printf
2.5 35 35 5子程序執行else語句裡的printf,父程序執行if語句裡的printf,父程序執行最後乙個printf,子程序執行最後乙個printf
3.35 5 5 35父程序執行if語句裡的printf然後子程序執行else語句裡的printf,子程序執行最後乙個printf,父程序執行最後乙個printf
4.5 35 5 35子程序執行if語句裡的printf然後父程序執行else語句裡的printf,父程序執行最後乙個printf,子程序執行最後乙個printf
5.35 35 5 5父程序執行if語句裡的printf然後父程序執行最後乙個printf,子程序執行else語句裡的printf,子程序執行最後乙個printf
6.5 5 35 35子程序執行if語句裡的printf然後子程序執行最後乙個printf,父程序執行else語句裡的printf,父程序執行最後乙個printf
五、實驗總結
1.寫出實驗報告。
2. 利用
vim對
linux
3.編寫fork()程式,並利用gcc進行編譯、除錯和執行。
實驗2 Linux程序管理
列印當前所有環境變數的值 新增新的環境變數newenv first 修改環境變數newenv的值為second 列印環境變數newenv的值。include include include include extern char environ intmain putenv newenv first...
Linux教程 2 Linux的基本指令
什麼是linux的指令?指在linux終端 命令列 中輸入的內容就稱之為指令 乙個完整的指令的標準格式 linux通用的格式 指令主體 空格 選項 空格 操作物件 乙個指令可以包含多個選項 操作物件也可以是多個 用法 含義引數說明 ls列出當前工作目錄下的所有檔案 資料夾的名稱 ls 路徑 列出指定...
Linux學習筆記 2 Linux命令基本格式
登入系統後是這樣的格式 root bogon 這裡的root位置是使用者名稱。bogon位置是主機名 往往應是localhost 表示當所在目錄 家目錄 對管理員來說這個目錄是 root 對普通使用者來說是 home 使用者名稱 在建立使用者同時家目錄會自動生成。位置的符號用來判斷當前使用者是超級使...