日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux命令解释程序实验,实验二 命令解释程序的使用

發布時間:2024/7/5 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux命令解释程序实验,实验二 命令解释程序的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗二 命令解釋程序的使用

一、實驗目的

掌握UNIX或LINUX環境下命令解釋程序的使用

能對編寫簡單的C程序,進行編譯運行和調試。

二、實驗內容

輸入LINUX相關命令后記錄系統輸出

簡單的C程序,進行編譯運行和調試

三、實驗步驟

1、命令操作

1) 瀏覽目錄和文件的各種屬性 ls –l、

2) 顯示文件內容 cat、more、

3) 改變文件和目錄的權限chmod、

4) 顯示當前目錄 pwd、

5) 文字統計 wc、

6) 查看時間命令 date 、time、

7) 幫助命令 help、

8) 查看與刪除進程命令ps, kill、

9) 查看在線用戶 who

2、GNU gcc

GCC 是GNU提供的C 和C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和Object C(C 語言的一種面向對象擴展)。利用gcc命令可同時編譯并連接C 和C++ 源程序。如果你有兩個或少數幾個C 源文件,也可以方便地利用GCC 編譯、連接并生成可執行文件。

* gcc 命令的基本用法如下:

gcc [options] [filenames]

* gcc的主要選項:

-ansi 只支持ANSI 標準的C語法。這一選項將禁止GNU C的某些特色,例如asm 或typeof 關鍵詞。 -c 只編譯并生成目標文件。 -DMACRO 以字符串“1”定義MACRO 宏。 -DMACRO=DEFN 以字符串“DEFN”定義MACRO 宏。 -E 只運行C 預編譯器。 -g 生成調試信息。GNU 調試器可利用該信息。 -IDIRECTORY 指定額外的頭文件搜索路徑DIRECTORY。 -LDIRECTORY 指定額外的函數庫搜索路徑DIRECTORY。 -lLIBRARY 連接時搜索指定的函數庫LIBRARY。 -m486 針對486 進行代碼優化。 -o FILE 生成指定的輸出文件。用在生成可執行文件時。 -O0 不進行優化處理。 -O 或-O1 優化生成代碼。 -O2 進一步優化。 -O3 比-O2 更進一步優化,包括inline 函數。 -shared 生成共享目標文件。通常用在建立共享庫時。 -static 禁止使用共享連接。 -UMACRO 取消對MACRO 宏的定義。 -w 不生成任何警告信息。 -Wall 生成所有警告信息。

<1> 輸入gcc test.c

<2> 輸入ls查看,目錄下應該有個a.out文件

<3> 輸入./a.out,運行程序,屏幕上顯示

The string is hello world

The string printed backward is

<4> 如果想給程序重命名,使用編譯選項-o重新編譯。輸入gcc –o test test.c

<5> 輸入ls查看,目錄下應該有個test文件

<3> 輸入 ./test,運行程序

這個程序執行時顯示如下結果:

The string is hello world

The string printed backward is

輸出的第一行是正確的,但第二行打印出的東西并不是我們所期望的。我們所設想的輸出應該是: The string printed backward is dlrow olleh。由于某些原因,my_print2 函數沒有正常工作。下面讓我們用gdb 看看問題究竟出在哪兒。

3、GNU gdb

gdb 是一個用來調試C 和C++ 程序的強力調試器。以下是gdb 所提供的一些功能:它使你能監視你程序中變量的值;它使你能設置斷點以使程序在指定的代碼行上停止執行;它使你能一行行的執行你的代碼。 在命令行上鍵入gdb并按回車鍵就可以運行gdb 了。

**gdb 的常用命令:

File 裝入想要調試的可執行文件。

List 列出產生執行文件的源代碼的一部分。

Run 執行當前被調試的程序。

Break 在代碼里設置斷點,這將使程序執行到這里時被掛起。

Next 執行一行源代碼但不進入函數內部。

Step 執行一行源代碼而且進入函數內部。

Watch 使你能監視一個變量的值而不管它何時被改變。

Print 使你能查看變量值。

Kill 終止正在調試的程序。

Quit 終止gdb。**

<1>加入調試編譯選項-ggdb,重新編譯。輸入gcc -ggdb -o test test.c

<2>輸入命令gdb進入調試環境。

<3>在gdb 命令行提示符下鍵入file test,裝入程序。屏幕顯示:

Reading symbols from test...done.

<4>輸入命令run,運行程序。屏幕顯示:

Starting program: /home/zjh/test

The string is hello world

The string printed backward is

Program exited with code 040.

<5>輸入命令list,顯示程序代碼

1 #include

2

3 void my_print(char *);

4 void my_print2(char *);

5

6 main()

7 {

8 char my_string[] = "hello world";

9 my_print(my_string);

10 my_print2(my_string);

再輸入命令list,顯示后續的程序代碼。

<6>輸入break 26,屏幕顯示

Breakpoint 1 at 0x80485a0: file test.c, line 26.

<7>輸入run,屏幕顯示

Starting program: /home/zjh/test

The string is hello world

Breakpoint 1, my_print2 (string=0xbffffa40 "hello world") at test.c:26

26 string2[size - i] = string[i];

<8> watch string2[size-i],屏幕顯示

Watchpoint 2: string2[size - i]

<9>輸入next,程序運行了第26行,屏幕顯示

Watchpoint 2: string2[size - i]

Old value = 0 '\000'

New value = 104 'h'

my_print2 (string=0xbffffa40 "hello world") at test.c:24

24 for (i = 0; i < size; i++)

<10> 在gdb 提示符下按回車鍵將重復上一個命令。

<11> 通過跟蹤可以發現,當i=10 時,表達式string2[size - i] 的值等于‘d‘,size-i的值等于1,最后一個字符已經拷到新串里了。如果你再把循環執行下去,你會看到已經沒有值分配給string2[0] 了,而它是新串的第一個字符,因為malloc函數在分配內存時把它們初始化為空(null)字符。所以string2 的第一個字符是空字符。這解釋了為什么在打印string2 時沒有任何輸出了。

<12> 現在找出了問題出在第26行,改正程序,重新編譯運行。正確結果如下:

The string is hello world

The string printed backward is dlrow olleh

修改后test.c的完整代碼如下:

4、GNU make

在大型的開發項目中,通常有幾十到上百個的源文件,如果每次均手工鍵入gcc 命令進行編譯的話,則會非常不方便。因此,人們通常利用make 工具來自動完成編譯工作。這些工作包括:如果僅修改了某幾個源文件,則只重新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。實際上,make工具通過一個稱為makefile 的文件來完成并自動維護編譯工作。makefile需要按照某種語法進行編寫,其中說明了如何編譯各個源文件并連接生成可執行文件,并定義了源文件之間的依賴關系。當修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。

makefile文件是許多編譯器,包括Windows NT下的編譯器維護編譯信息的常用方法,只是在集成開發環境中,用戶通過友好的界面修改makefile 文件而已。默認情況下,GNU make 工具在當前工作目錄中按如下順序搜索makefile:

* GNUmakefile

* makefile

* Makefile

在UNIX 系統中,習慣使用Makefile 作為makfile 文件。如果要使用其他文件作為makefile,則可利用類似下面的make 命令選項指定makefile 文件:

$ make -f Makefile.debug

makefile 中一般包含如下內容:

1. 需要由make 工具創建的項目,通常是目標文件和可執行文件。通常使用“目標(target)”一詞來表示要創建的項目。

2. 要創建的項目依賴于哪些文件。

3. 創建每個項目時需要運行的命令。

例如,假設你現在有一個C++ 源文件test.C,該源文件包含有自定義的頭文件test.h,

則目標文件test.o 明確依賴于兩個源文件:test.C 和test.h。另外,你可能只希望利用g++

命令來生成test.o 目標文件。這時,就可以利用如下的makefile 來定義test.o 的創建規則:

# This makefile just is a example.

# The following lines indicate how test.o depends

# test.C and test.h, and how to create test.o

test.o: test.C test.h

g++ -c -g test.C

從上面的例子注意到,第一個字符為# 的行為注釋行。第一個非注釋行指定test.o 為目標,并且依賴于test.C 和test.h 文件。隨后的行指定了如何從目標所依賴的文件建立目標。當test.C 或test.h 文件在編譯之后又被修改,則make 工具可自動重新編譯test.o,如果在前后兩次編譯之間,test.C 和test.h 均沒有被修改,而且test.o 還存在的話,就沒有必要重新編譯。這種依賴關系在多源文件的程序編譯中尤其重要。通過這種依賴關系的定義,make 工具可避免許多不必要的編譯工作。當然,利用Shell 腳本也可以達到自動編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而make 工具則可根據目標上一次編譯的時間和目標所依賴的源文件的更新時間而自動判斷應當編譯哪個源文件。一個makefile 文件中可定義多個目標,利用make target 命令可指定要編譯的目標,如果不指定目標,則使用第一個目標。通常,makefile 中定義有clean 目標,可用來清除編譯過程中的中間文件,例如:

clean:

rm -f *.o

運行make clean 時,將執行rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。

makefile 變量:

GNU 的make 工具除提供有建立目標的基本功能之外,還有許多便于表達依賴性關系以及建立目標的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個C 源文件,而為每個目標的編譯指定冗長的編譯選項的話,將是非常乏味的。但利用簡單的 變量定義 ,可避免這種乏味的工作:

# Define macros for name of compiler

CC = gcc

# Define a macr o for the CC flags

CCFLAGS = -D_DEBUG -g -m486

# A rule for building a object file

test.o: test.c test.h

$(CC) -c $(CCFLAGS) test.c

在上面的例子中,CC 和CCFLAGS 就是make 的變量。GNU make 通常稱之為變量,而其他UNIX 的make 工具稱之為宏,實際是同一個東西。在makefile 中引用變量的值時,只需變量名之前添加$ 符號,如上面的$(CC)和$(CCFLAGS)。

任務:假設你有兩個源文件main.c 和factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。

// factorial.c

int factorial(int n) {

if (n <= 1)

return 1;

else

return factorial(n - 1)*n;

}

// main.c

int factorial(int n);

int main(int argc, char **argy){

int n;

if(argc < 2){

printf("Usage:%s n\n", argy[0]);

return -1;

}

else {

n = atoi(argy[1]);

printf("Factorial of %d is %d.\n", n, factorial(n));

}

return 0;

}

請編寫出編譯程序factorial 的makefile,并編譯。

* Makefile文件的內容如下:

* 編譯執行

四、總結

問題:在使用watch string[size – i]命令設置觀察點時,fedora上使用info watchpoints時雖然也顯示也設置了觀察點,但是當值改變時,gdb卻沒顯示出來。

方法:換另一個環境運行調試,比如centos7.3等等

總結

以上是生活随笔為你收集整理的linux命令解释程序实验,实验二 命令解释程序的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。