天天看點

一些LinuxC的小知識點(二)

      系統調用read的作用是:從與檔案描述符filedes相關聯的檔案裡讀入nbytes個位元組的資料,并把它們放到資料區buf中。它傳回實際讀入的位元組數。這可能會小于請求的位元組數。如果read調用傳回0,就表述未讀入任何資料,已經達到了檔案尾。同樣,如果傳回的是-1,就表示read調用出現了錯誤。

為了更友善地一眼看出程式輸出的資訊,很多時候我們都想要用顔色讓輸出的結果更為直覺,無奈Linux下的顔色永遠都是黑底綠字。其實改變顔色的方式很簡單。如下代碼所示

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

輸出的效果:

一些LinuxC的小知識點(二)

需要include的頭檔案

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

對于多線程makefile中,要注意添加-lpthread,以便添加pthread的連結庫。另外,需要加入宏定義-D_REENTRANT,以便将有的不可充入的函數或者變量,變成可重入的,以便适應多線程的要求(詳見圖1)。

一些LinuxC的小知識點(二)

下面是一個多線程的makefile。其中在ihome_arm.c這個檔案中,我們用到了多線程。在ihome_arm.c中我們需要引用comtest.c中的函數。

一些LinuxC的小知識點(二)

-linux-gcc -o ihome_arm comtest.o ihome_arm.o -L/usr/include/nptl -

-linux-gcc -

-linux-gcc -D_REENTRANT -I/usr/include/nptl -

rm ihome_arm comtest.o ihome_arm.o

一些LinuxC的小知識點(二)

-L/usr/include/nptl 的說明見圖2.

一些LinuxC的小知識點(二)

                                                                         圖2 為什麼添加-L/usr/include/nptl

以上圖檔來自《Linux程式設計 第四版》

在知識點四中,我們程式裡面有comtest.c、comtest.h、ihome_arm.c。其中在ihome_arm.c這個檔案中,我們用到了多線程。在ihome_arm.c中我們需要引用comtest.c中的函數。我曾很傻氣地直接在ihome_arm.c中直接引用comtest.c,結果導緻大量的重複定義出現。正确的方式應該是,為ihome_arm.c引用的類型、變量、函數寫一個comtest.h的頭檔案,這樣就不會引起大量的重複定義。頭檔案編寫的注意事項見上一篇文章。

函數名: sleep 

頭檔案: #include <windows.h> // 在VC中使用帶上頭檔案 

             #include <unistd.h>    // 在gcc編譯器中,使用的頭檔案因gcc版本的不同而不同 

功  能 : 執行挂起指定的秒數 

語  法 : unsigned sleep(unsigned seconds);

示例:

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

函數名: usleep 

頭檔案: #include <unistd.h> 

功  能:  usleep功能把程序挂起一段時間, 機關是微秒(百萬分之一秒); 

語  法:  void usleep(int micro_seconds); 

傳回值: 無

内容說明:本函數可暫時使程式停止執行。參數 micro_seconds 為要暫停的微秒數(us)。 

 注 意: 

這個函數不能工作在windows 作業系統中。用在Linux的測試環境下面。 

參 見:usleep() 與sleep()類似,用于延遲挂起程序。程序被挂起放到reday queue。一般情況下,延遲時間數量級是秒的時候,盡可能使用sleep()函數。如果延遲時間為幾十毫秒(1ms = 1000us),或者更小,盡可能使用usleep()函數。這樣才能最佳的利用CPU時間。

 微秒,時間機關,符号us(英語:microsecond ). 

1微秒等于百萬分之一秒(10的負6 次方秒) 

0.000 001 微秒 = 1皮秒 

0.001 微秒 = 1納秒 

1,000 微秒 = 1毫秒 

1,000,000 微秒 = 1秒 

1s = 1000ms 

1ms = 1000μs 

1μs = 1000ns 

1ns = 1000ps 

1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 納秒(ns) = 1,000,000,000,000 皮秒(ps)

一些LinuxC的小知識點(二)

=pthread_join ( a_thread,&

一些LinuxC的小知識點(二)

      在代碼段中的灰色背景代碼中,這句話關系到子線程a_thread能不能正常地運作完,pthread_join讓main所在的主線程等待a_thread線程結束,才繼續從pthread_join語句中往下執行。如果沒有這一句,當子線程是比較耗時的操作,它在主線程運作到return EXIT_SUCCESS;的時候還沒有結束的話,那麼随着main所在的主線程的退出,子線程a_thread也将退出,也就是a_thread不能被正确地執行完,而是意外地退出了。 

     我們給pthread_join傳遞了兩個參數,一個正在等待器結束的線程的辨別符athread,另一個是指向線程傳回值的指針。這個函數将等到它所指定的線程終止後才傳回。然後main函數在pthread_join行之後,繼續執行。

errno定義在頭檔案<errno,h>中,他是一個整形的變量。當系統調用和其他庫函數發送錯誤的時候,errno用來辨別錯誤是什麼。

常用的用來報告錯誤的函數。它們是strerror和perror。

1、strerror用來将錯誤代碼errno映射成一個字元串,該字元串對發生的錯誤類型進行說明。

函數原型如下

2、perror用來把errno變量中報告的目前錯誤映射到一個字元串,并把它輸出到标準錯誤輸出流。該字元串的前面先加上字元串s(如果不為空)中給出的資訊,在加上一個冒号和一個空格。

3、一個小樣例。在下面的這個例子中,我們錯誤地打開一個不存在的檔案,産生一個errno,并用strerror和perror進行報告。

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

輸出的結果如下:

一些LinuxC的小知識點(二)

一個常見的錯誤用法如下所示:

當somecall引發了一個錯誤,errno被賦上值之後。你不應該直接使用errno進行其他的操作,在以上代碼段中,errno可能被printf函數改變。如果我們要使用errno,最好的辦法就是如下代碼段所示的,把它儲存在一個變量中,然後再使用。

首先注意,extern關鍵字不是用來聲明全局變量的。下面看一段錯誤的代碼

然後我們想要在下面的源檔案中引用something。

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

因為extern不是這麼用的。extern的出現是為了解決源檔案中的東西,不能被其他源檔案通路的問題。一般來說,假設我們要通路一個源檔案(假設是源檔案myCode.c)中的變量,那麼我們需要先在源檔案MyCode.c中定義一個變量,通常是在所有函數的開頭。然後在這個源檔案對應的頭檔案MyCode.h中用extern标志這個變量,那麼當其他源檔案MyCodeTwo.c引用了頭檔案MyCode,h的時候,就可以通路到MyCode.c中定義的變量。如下代碼段所示。

一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)
一些LinuxC的小知識點(二)

tar在linux上是常用的打包、壓縮、加壓縮工具,他的參數很多,這裡僅僅列舉常用的壓縮與解壓縮參數。

1、将整個/home/www/images 目錄下的檔案全部打包為 /home/www/images.tar

在參數f後面的壓縮檔案名是自己取的,習慣上用tar來做,如果加z參數,則以tar.gz 或tgz來代表gzip壓縮過的tar file檔案

2、将 /home/www/images.tar.gz 解壓到/home/www下面

解壓到指定的目錄

解包到指定的目錄

本文轉自陳哈哈部落格園部落格,原文連結http://www.cnblogs.com/kissazi2/p/3148053.html如需轉載請自行聯系原作者

kissazi2