《信息安全系統設計基礎》第11周問題總結

第11周學習任務:

  1. 掌握系統編程和系統調用的概念
  2. 掌握系統編程錯誤處理的方式
  3. 掌握Unix/Linux系統級I/O:open close read write seek stat
  4. 掌握RIO
  5. 掌握I/O重定向的方法

  下面我在閱讀了完成本週做業的78位同窗的博客後,將同窗們所遇到的的問題進行了總結,針對沒有解決的問題,給出了一些本身的見解,若有不妥,還望批評指正。下面是個人具體總結,但願能夠幫助同窗們更好的理解系統調用。(有重複的問題,只涉及了一次)html

  

所遇問題及解決辦法

   問題1描述:不是說fork函數,產生的兩個線程的執行順序是不肯定的,爲何我屢次執行,都是先顯示父進程的,如圖所示:編程

   解答:的確,當咱們在系統上運行這個程序時,父進程先完成了他的printf語句,在另外一個系統上可能正好相反;輸出行的順序根據系統不一樣而不一樣,取決於內核如何交替執行父子進程的指令,通常而言,只要是知足條件的拓撲順序都是合法的順序。數組

 

 

   問題1描述:運行sigdemo1.csigdemo2.csigdemo3.csigactdemo.c安全

sigactdemo2.c是按Ctrl+c不能終止程序進行。
markdown

   5219的解決辦法:sigdemo3.c中輸入quit結束程序運行。其餘的我直接關閉了終端.app

  解答:ctrl-c 發送 SIGINT 信號給前臺進程組中的全部進程,經常使用於終止正在運行的程序, 也就是直接中止當前執行的命令;ctrl-z 發送 SIGTSTP 信號給前臺進程組中的全部進程,經常使用於掛起一個進程,也就是掛起當前執行的命令。因此,ctrl +z能夠結束。函數

 問題2描述:編譯運行testpp.c後出現段錯誤……post

 

  5219的解決辦法:她修改了代碼學習

 

 

  解答:char **pp,我喜歡叫他重指針,與數組不一樣的是,他在聲明的時候沒有分配空間,因此要malloc一下。ui

    問題描述:wc統計子目錄代碼時出現以下報錯,查詢資料得知若是目標文件開頭用通配符 *表示,則需轉義。

  

   5328的解決辦法:*前加\便可

  解答:wc只能統計當前目錄下所指定的文件類型,不能穿過文件夾。話說,直接cd進子文件夾不就行了。。

    問題描述:虛擬機崩了包括整個電腦都帶不起來沒法開機。只得重裝系統,又因若干寫入註冊表的內容沒法備份

   5337的解決辦法:重裝系統

  解答:這個問題。。很殘酷,電腦都沒法開機了,沒辦法的辦法,只能重裝了;virtual box能夠多重載入,詳見我以前的博客基於VirtualBox的多重載入,但願這能省去你從新配置虛擬機的麻煩。

   問題1描述:對於教材中信號方面的代碼不太理解。

  解答:music,「若是你願意一層一層剝開個人心」。對,抽絲剝繭,方見真諦 ,其實這些代碼都不是很長,也不復雜,只要單獨弄清每個函數的意思,應用到老師的代碼裏就能夠理解了。

  問題2描述:編譯forkdemo1.c的時候出錯

  5231解決辦法:根據提示修改源代碼,加入#include <stdio.h>從新編譯便可

  解答:我編代碼的時候有個習慣,就是把經常使用的頭文件全加上,省去以後出錯檢查的麻煩。

   問題描述:一體機每次打開vi都會出現以下亂碼,爲何呀:

 

  解答:會不會是不當心刪了或修改了代碼,畢竟testbuf2.c裏就一個printf和while啊。。

   問題1描述:exec1.c中:

  - 疑問:爲何沒有顯示最後打印的一句?   5222解答:由於在系統處理器中,在執行`execvp( "ls" , arglist );`語句時,已經將最後的打印語句覆蓋掉了,處理器中並無這句打印語句。
 

   問題描述:教材中介紹了教材中錯誤處理包裝函數定義在一個叫作csapp.c的文件中,他們的原型定義在一個叫作csapp.h的頭文件中,因此要想正確編譯課本代碼應使用gcc include/csapp.c include/csapp.h src/week11/fork.c -o bin/fork,可是會產生如下錯誤提示:

  5224解決方案:應該是系統沒有找到函數中包含的相應函數,因而我將對應的函數都註釋了再編譯的時候就能夠了。

  

    問題描述:習題8.3:剛開始看着道題的時候,認爲有4種輸出序列:abcc、bacc、acbc、bcac。可是答案上只寫了3個,沒有bcac。

   5337的解決辦法:忽略了waitpid函數。由於有waitpid,要等待子進程結束時,纔會執行父進程的打印c命令。bcac是父進程都結束了,a進程尚未開始,因此不會有這種輸出順序。

  解答:有waitpid,父進程會一直等待子進程。

    問題描述:在運行argtest的時候,出現了問題。

 

   5326的解決辦法:後來發現,應該將argtest.c和makeargv.c,還有freemakeargv.c和argv.h放在同一目錄下;運行成功~

argv文件夾中的主要程序是argtest.c

  有兩種運行方法:
  第一種是用-c將全部.c的文件編譯成後綴爲.o的文件,而後一塊兒編譯成可執行文件。
  第二種方法是直接將全部的.c文件編譯成可執行文件,運行結果是同樣的。

 

 

    問題描述:

在虛擬機中使用/proc文件系統,結果顯示權限不夠,如圖所示:

  5216解決方法:經過最後一節內容得知,是因爲輸入方法不對,應該輸入的是cat打印指令,再接後面的目錄,以下圖:

 

  解答:畢竟這只是一個文件,不是一個程序,很差執行,只能顯示

    問題描述:

  • 課本P504的代碼的第14行中的strchr是什麼函數?

   5240的解決辦法:char *strchr(const char* _Str,int _Val)

                       char *strchr(char* _Str,int _Ch)

功能:查找字符串s中首次出現字符c的位置

說明:返回首次出現c的位置的指針,返回的地址是被查找字符串指針開始的第一個與Val相同字符的指針,若是s中不存在c則返回NULL。

 返回值:成功則返回要查找字符第一次出現的位置,失敗返回NULL

    問題描述:關於pipe.c的命令順序不一樣產生的運行結果不一樣

    • 執行命令bin/pipe man lsbin/pipe ls man的結果不同

    • 因爲pipe.c的效果等同與命令行中的|管道

 

   5214的解決辦法:出現這個結果的緣由是管道命令自己的使用規則,以下圖,command1正確輸出,做爲command2的輸入 而後comand2的輸出做爲,comand3的輸入 ,comand3輸出就會直接顯示在屏幕上面了,而經過管道以後comand1,comand2的正確輸出不顯示在屏幕上面

  解答:若是是ls | sort的話,還真是不能注意到這個問題,深入。

附指針數組、數組指針、指針函數、函數指針的區別

數組指針(也稱行指針)

定義 int (*p)[n];
()優先級高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也能夠說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。

如要將二維數組賦給一指針,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義一個數組指針,指向含4個元素的一維數組。
 p=a;        //將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]
 p++;       //該語句執行事後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]

因此數組指針也稱指向一維數組的指針,亦稱行指針。

指針數組

 


定義 int *p[n];
[]優先級高,先與p結合成爲一個數組,再由int*說明這是一個整型指針數組,它有n個指針類型的數組元素。這裏執行p+1時,則p指向下一個數組元素,這樣賦值是錯誤的:p=a;由於p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],並且它們分別是指針變量能夠用來存放變量地址。但能夠這樣 *p=a; 這裏*p表示指針數組第一個元素的值,a的首地址的值。
如要將二維數組賦給一指針數組:
int *p[3];
int a[3][4];
p++; //該語句表示p數組指向下一個數組元素。注:此數組每個元素都是一個指針
for(i=0;i<3;i++)
p[i]=a[i]
這裏int *p[3] 表示一個一維數組內存放着三個指針變量,分別是p[0]、p[1]、p[2]
因此要分別賦值。

這樣二者的區別就豁然開朗了,數組指針只是一個指針變量,彷佛是C語言裏專門用來指向二維數組的,它佔有內存中一個指針的存儲空間。指針數組是多個指針變量,以數組形式存在內存當中,佔有多個指針的存儲空間。
還須要說明的一點就是,同時用來指向二維數組時,其引用和用數組名引用都是同樣的。
好比要表示數組中i行j列一個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

優先級:()>[]>*

 函數指針
在C語言中,一個函數老是佔用一段連續的內存區,而函數名就是該函數所佔內存區的首地址.咱們能夠把函數的這個首地址(或稱入口地址)賦予一個指針變量,使該指針變量指向該函數.而後經過指針變量就能夠找到並調用這個函數.咱們把這種指向函數的指針變量稱爲「函數指針變量」.
函數指針變量定義的通常形式爲:
類型說明符 (*指針變量名)();
其中「類型說明符」表示被指函數的返回值的類型.「(* 指針變量名)」表示「*」後面的變量是定義的指針變量.最後的空括號表示指針變量所指的是一個函數.
例如:
int (*pf)();
表示pf是一個指向函數入口的指針變量,該函數的返回值(函數值)是整型.

指針函數函數類型是指函數返回值的類型.在C語言中容許一個函數的返回值是一個指針(即地址),這種返回指針值的函數稱爲指針型函數.定義指針型函數的通常形式爲:類型說明符 *函數名(形參表) { …… /*函數體*/} 其中函數名以前加了「*」號代表這是一個指針型函數,即返回值是一個指針.類型說明符表示了返回的指針值所指向的數據類型.如:int *ap(int x,int y){./*函數體*/}表示ap是一個返回指針值的指針型函數,它返回的指針指向一個整型變量.

相關文章
相關標籤/搜索