實驗2 Linux下基本程式設計

2021-08-13 03:05:02 字數 3810 閱讀 1091

實驗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 使用者名稱 在建立使用者同時家目錄會自動生成。位置的符號用來判斷當前使用者是超級使...