《UNIX環境高階程式設計》 —— 書中例項編譯、執行
想認真學習《UNIX環境高階程式設計》的人士可能都想把書中的例項給敲一遍,執行看一下效果。但對於新手來說,可能會有一定的困難,因為例子中用到的標頭檔案和一些函式不知道在哪裡,編譯可能也會出問題。這邊文章就是以一個例項來介紹如何執行這本書中的例項。
但這樣還不行,如果直接編譯會有如提示找不到err_***函式的定義,這是因為例子裡用的錯誤處理函式在apue.h中有宣告,卻定義在另一個檔案中,
把apue.h和myerr.h這兩個檔案都準備好了,接下來就可以敲程式碼、編譯執行了。
如書中第一個例子:
myls.c
#include "apue.h" #include "myerr.h" //這個標頭檔案需要自己加進去 #include <dirent.h> int main(int argc, char * argv[]) { DIR * dp; struct dirent *dirp; if (2 != argc) { err_quit("usage: ls directory_name"); } if ( NULL == (dp = opendir(argv[1]))) { err_sys("can't open %s", argv[1]); } while (NULL != (dirp = readdir(dp))) { printf("%s\n", dirp->d_name); } close(dp); exit(0); }
cc myls.c
這樣固然可以編譯,但每次寫一個例項都要把apue.h和myerr.h兩個檔案拷貝到當前目錄裡,這樣做是很不好的一個習慣,也不合理。
一個解決方法就是把這兩個公共檔案放到一個目錄裡(如:../include ),編譯的時候指定標頭檔案目錄就可以了。
cc -I../include myls.c
檔案結構:
linux:/mnt/hgfs/vmware-share/unix # tree -a
.
|-- chapter-1
| |-- makefile
| `-- myls.c
`-- include
|-- apue.h
`-- myerr.h
但這樣又有一個新問題,就是每次編譯需要鍵盤敲的字母變得多了,耽誤時間。特別是當編譯選項比較多,檔案也比較多時,這樣做就變得基本不可能了。這時,我們自然而然就會想到makefile。下面就是針對這個例子編寫的makefile:
CC = gcc
ROOT := $(shell pwd)/..
INCLUDE := $(ROOT)/include
CFLAGS += -I$(INCLUDE)
default:my_ls
my_ls:myls.o
$(CC) -o my_ls myls.o
myls.o:myls.c
$(CC) $(CFLAGS) -c myls.c
clean:
-rm *.o my_ls
這樣,我們編譯就變得輕鬆多了,直接make。
結果:
linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ll
drwxrwxrwx 1 root root 4096 2014-04-02 22:56 .
drwxrwxrwx 1 root root 0 2014-04-02 22:18 ..
-rwxrwxrwx 1 root root 220 2014-04-02 22:24 makefile
-rwxrwxrwx 1 root root 8892 2014-04-02 22:56 my_ls
-rwxrwxrwx 1 root root 402 2014-04-02 22:07 myls.c
-rwxrwxrwx 1 root root 2132 2014-04-02 22:56 myls.o
linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls
usage: ls directory_name
linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls /mnt/hgfs/vmware-share/unix/
.
..
chapter-1
include
linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls /mnt/hgfs/vmware-share/unix/chapter-1/
.
..
makefile
myls.c
myls.o
my_ls
linux:/mnt/hgfs/vmware-share/unix/chapter-1 #
相關推薦
《UNIX環境高階程式設計》 —— 書中例項編譯、執行
想認真學習《UNIX環境高階程式設計》的人士可能都想把書中的例項給敲一遍,執行看一下效果。但對於新手來說,可能會有一定的困難,因為例子中用到的標頭檔案和一些函式不知道在哪裡,編譯可能也會出問題。這邊文章就是以一個例項來介紹如何執行這本書中的例項。 但這樣還不行,如果直接編
《UNIX環境高階程式設計》中涉及到一段程式碼,ourhdr.h檔案,以後備用!
#ifndef __ourhdr_h #define __ourhdr_h #include <errno.h> /*for definition of errno */ #inc
《unix環境高階程式設計》書中原始碼編譯 詳細流程
(2)解壓到了 /home/username/ 目錄下,即/home/username/apue.2e (注意:username即是自己的使用者名稱,下同)。 (3)此時cd到apue.2e目錄,輸入make,出錯如下: make[2]: Enterin
linux下執行《UNIX環境高階程式設計》的第一個程式時原始碼編譯出錯的處理方法
前幾天買了《UNIX環境高階程式設計》這本書,想好好學習下linux的程式設計。誰知道看到第一個列出指定目錄的內容的那個例子,其實就是shell中 ls 的內容,打好程式碼要執行時一直出問題。後來在網上找了挺多的解決方法,終於解決了。先把方法貼上。 先在終端裡面輸入 vi
《UNIX環境高階程式設計》原始碼編譯方法
最近在學習《UNIX環境高階程式設計》(Advanced Programming in the UNIX Environment, 簡稱APUE,以下使用簡稱)。該書的作者是W.Richard.Stevens,國際知名的UNIX和網路專家。我看的是該書的第一版,尤晉元翻譯的
UNIX環境高階程式設計的學習(二)
UNIX系統程序控制程式說明 該程式從標準輸入讀取命令,然後執行這些命令,程式涉及到的函式主要用法包括: fgets的用法 execlp的用法 waitpid的用法 程式如下: #include "apue.h" #include <sys/wai
UNIX環境高階程式設計的學習(一)
UNIX環境高階程式設計第一個例子的編譯 這本書中有很多的例子,為了加深理解,習慣性自己敲一遍程式碼然後看執行結果,再去理解其中的知識點,但是在虛擬機器下如何編譯這些程式碼呢,需要以下幾步: 下載並解壓縮apue.3e檔案包 在“apue.h”中最後一行加:#inclu
[UNIX環境高階程式設計] 檔案和目錄
1 引言 上文圍繞了普通檔案I/O進行了討論——開啟檔案、讀檔案或寫檔案。本文將描述檔案系統的其他特徵和檔案的性質。將從stat函式開始,stat結構中的大多數成員都是基本系統資料型別,逐個分解stat結構的每一個成員以瞭解檔案的所有屬性。 使用stat函式最多的地方可能就是[ls -l
[Unix環境高階程式設計] 檔案I/O
1.引言 UNIX系統中的大多數檔案I/O只需要用到5個函式:open、read、write、lseek以及close,這裡所涉及到的函式經常被稱為不帶緩衝的I/O1。只要涉及在多個程序之間共享資源,原子操作的概念就變得非常重要,我們將通過I/O和open函式的引數來討論此概念,dup、
UNIX環境高階程式設計(第三版) 第五章筆記
5.2 流和物件 只有兩個函式可以改變流的定向: freopen函式清楚一個流的定向,fwide函式可用於設定一個流的定向。 #include <stdio.h> #include <wchar.h> int fwide(FILE
UNIX環境高階程式設計(三) 第六章
6 系統資料檔案和資訊 6.2 口令檔案 #include <pwd.h> struct passwd *getpwuid(uid_t uid); /* 檢視使用者登入名 */ struct passwd *getpwnam(const
UNIX環境高階程式設計(3) 第三章
3 檔案I/O 3.1 引言 3.2 檔案描述符 檔案描述符是一個標示,非負整數,類似於windows裡的控制代碼,為了與標準C保持一致(標準C裡的檔案的讀寫都是通過File Pointer)UNIX採用了這樣的三級結構,我混淆於檔案描述標誌和檔案
UNIX環境高階程式設計(3) 第八章
8 程序控制 8.1 引言 8.2 程序標識 #include <unistd.h> pid_t getpid(void); return: 呼叫程序的程序ID pid_t getppid(void
UNIX環境高階程式設計(3) 第二章
2.2UNIX標準化 2.2.1 ISO C 國際標準化組織(International Organization for Standardization,ISO) 國際電子技術委員會(International Electrotechnical Co
UNIX環境高階程式設計(3) 第一章
1.1 引言 所有作業系統都為他們所執行的程式提供服務。典型的服務包括:執行新程式、開啟檔案、讀檔案、分配儲存區以及獲取當前時間等。 1.2 UNIX體系結構 層級從裡向外擴充套件應用。 1. 核心:可將作業系統定義為一種軟體,即稱為核心,它控制
UNIX環境高階程式設計-概述
檔案I/O 基本的系統呼叫函式 open,create,close,lseek,read,write 以及原子性的pread,pwrite 複製檔案描述符 dup 同步重新整理fsync,fdatasync,sync 更改已經開啟的檔案屬性 fcntl,雜物箱
Unix環境高階程式設計閱讀之一——Unix\Linux基礎知識
所有的作業系統都為它們所執行的程式提供服務。典型的服務包括:執行新程式、開啟檔案、讀檔案、分配儲存區以及獲得當前時間等。 UNIX體系結構示意圖 作業系統是用來控制計算機的硬體資源,提供程式執行環
Unix環境高階程式設計入門----Unix環境及系統資料資訊使用
Unix環境高階程式設計入門 ----Unix環境及系統資料資訊使用 Uni
Unix環境高階程式設計 讀書筆記 第三章 檔案IO
概述 對於open、read、write、lseek、close等函式,被稱為不帶緩衝的I/O。即unbuffered i/O,術語“不帶緩衝”指的是每個read或者write都呼叫核心中的一個系統呼叫。 檔案描述符 檔案描述符是一個非負的整數; 檔案描述符0與程序
Unix環境高階程式設計之檔案I/O
文章目錄 函式open和openat create函式 close函式 lseek函式 read函式 write函式 檔案共享 原子操作 dup和dup2函式 sync、fsync和fdatasync函式 fc