1. 程式人生 > >《UNIX環境高階程式設計》 —— 書中例項編譯、執行

《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