[ 收藏 ] [ 简体中文 ]  
臺灣貨到付款、ATM、超商、信用卡PAYPAL付款,4-7個工作日送達,999元臺幣免運費   在線留言 商品價格為新臺幣 
首頁 電影 連續劇 音樂 圖書 女裝 男裝 童裝 內衣 百貨家居 包包 女鞋 男鞋 童鞋 計算機周邊

商品搜索

 类 别:
 关键字:
    

商品分类

  •  管理

     一般管理学
     市场/营销
     会计
     金融/投资
     经管音像
     电子商务
     创业企业与企业家
     生产与运作管理
     商务沟通
     战略管理
     商业史传
     MBA
     管理信息系统
     工具书
     外文原版/影印版
     管理类职称考试
     WTO
     英文原版书-管理
  •  投资理财

     证券/股票
     投资指南
     理财技巧
     女性理财
     期货
     基金
     黄金投资
     外汇
     彩票
     保险
     购房置业
     纳税
     英文原版书-投资理财
  •  经济

     经济学理论
     经济通俗读物
     中国经济
     国际经济
     各部门经济
     经济史
     财政税收
     区域经济
     统计 审计
     贸易政策
     保险
     经济数学
     各流派经济学说
     经济法
     工具书
     通货膨胀
     财税外贸保险类考试
     英文原版书-经济
  •  社会科学

     语言文字
     社会学
     文化人类学/人口学
     新闻传播出版
     社会科学总论
     图书馆学/档案学
     经典名家作品集
     教育
     英文原版书-社会科学
  •  哲学

     哲学知识读物
     中国古代哲学
     世界哲学
     哲学与人生
     周易
     哲学理论
     伦理学
     哲学史
     美学
     中国近现代哲学
     逻辑学
     儒家
     道家
     思维科学
     马克思主义哲学
     经典作品及研究
     科学哲学
     教育哲学
     语言哲学
     比较哲学
  •  宗教

  •  心理学

  •  古籍

     经部  史类  子部  集部  古籍管理  古籍工具书  四库全书  古籍善本影音本  中国藏书
  •  文化

     文化评述  文化随笔  文化理论  传统文化  世界各国文化  文化史  地域文化  神秘文化  文化研究  民俗文化  文化产业  民族文化  书的起源/书店  非物质文化遗产  文化事业  文化交流  比较文化学
  •  历史

     历史普及读物
     中国史
     世界史
     文物考古
     史家名著
     历史地理
     史料典籍
     历史随笔
     逸闻野史
     地方史志
     史学理论
     民族史
     专业史
     英文原版书-历史
     口述史
  •  传记

  •  文学

  •  艺术

     摄影
     绘画
     小人书/连环画
     书法/篆刻
     艺术设计
     影视/媒体艺术
     音乐
     艺术理论
     收藏/鉴赏
     建筑艺术
     工艺美术
     世界各国艺术概况
     民间艺术
     雕塑
     戏剧艺术/舞台艺术
     艺术舞蹈
     艺术类考试
     人体艺术
     英文原版书-艺术
  •  青春文学

  •  文学

     中国现当代随笔
     文集
     中国古诗词
     外国随笔
     文学理论
     纪实文学
     文学评论与鉴赏
     中国现当代诗歌
     外国诗歌
     名家作品
     民间文学
     戏剧
     中国古代随笔
     文学类考试
     英文原版书-文学
  •  法律

     小说
     世界名著
     作品集
     中国古典小说
     四大名著
     中国当代小说
     外国小说
     科幻小说
     侦探/悬疑/推理
     情感
     魔幻小说
     社会
     武侠
     惊悚/恐怖
     历史
     影视小说
     官场小说
     职场小说
     中国近现代小说
     财经
     军事
  •  童书

  •  成功/励志

  •  政治

  •  军事

  •  科普读物

  •  计算机/网络

     程序设计
     移动开发
     人工智能
     办公软件
     数据库
     操作系统/系统开发
     网络与数据通信
     CAD CAM CAE
     计算机理论
     行业软件及应用
     项目管理 IT人文
     计算机考试认证
     图形处理 图形图像多媒体
     信息安全
     硬件
     项目管理IT人文
     网络与数据通信
     软件工程
     家庭与办公室用书
  •  建筑

     执业资格考试用书  室内设计/装潢装修  标准/规范  建筑科学  建筑外观设计  建筑施工与监理  城乡规划/市政工程  园林景观/环境艺术  工程经济与管理  建筑史与建筑文化  建筑教材/教辅  英文原版书-建筑
  •  医学

     中医
     内科学
     其他临床医学
     外科学
     药学
     医技学
     妇产科学
     临床医学理论
     护理学
     基础医学
     预防医学/卫生学
     儿科学
     医学/药学考试
     医院管理
     其他医学读物
     医学工具书
  •  自然科学

     数学
     生物科学
     物理学
     天文学
     地球科学
     力学
     科技史
     化学
     总论
     自然科学类考试
     英文原版书-自然科学
  •  工业技术

     环境科学
     电子通信
     机械/仪表工业
     汽车与交通运输
     电工技术
     轻工业/手工业
     化学工业
     能源与动力工程
     航空/航天
     水利工程
     金属学与金属工艺
     一般工业技术
     原子能技术
     安全科学
     冶金工业
     矿业工程
     工具书/标准
     石油/天然气工业
     原版书
     武器工业
     英文原版书-工业技
  •  农业/林业

     园艺  植物保护  畜牧/狩猎/蚕/蜂  林业  动物医学  农作物  农学(农艺学)  水产/渔业  农业工程  农业基础科学  农林音像
  •  外语

  •  考试

  •  教材

  •  工具书

  •  中小学用书

  •  中小学教科书

  •  动漫/幽默

  •  烹饪/美食

  •  时尚/美妆

  •  旅游/地图

  •  家庭/家居

  •  亲子/家教

  •  两性关系

  •  育儿/早教

  •  保健/养生

  •  体育/运动

  •  手工/DIY

  •  休闲/爱好

  •  英文原版书

  •  港台图书

  •  研究生
     工学
     公共课
     经济管理
     理学
     农学
     文法类
     医学

  •  音乐
     音乐理论

     声乐  通俗音乐  音乐欣赏  钢琴  二胡  小提琴
  • Linux環境高級程序設計
    該商品所屬分類:研究生 -> 工學
    【市場價】
    292-424
    【優惠價】
    183-265
    【作者】 黃茹、王小銀、張麗麗 
    【所屬類別】 圖書  教材  研究生/本科/專科教材  工學圖書  計算機/網絡  操作繫統/繫統開發  LINUX 
    【出版社】清華大學出版社 
    【ISBN】9787302520252
    【折扣說明】一次購物滿999元台幣免運費+贈品
    一次購物滿2000元台幣95折+免運費+贈品
    一次購物滿3000元台幣92折+免運費+贈品
    一次購物滿4000元台幣88折+免運費+贈品
    【本期贈品】①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
    版本正版全新電子版PDF檔
    您已选择: 正版全新
    溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。
    *. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。
    *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。
    *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。
    內容介紹



    開本:16開
    紙張:膠版紙
    包裝:平裝-膠訂

    是否套裝:否
    國際標準書號ISBN:9787302520252
    叢書名:高等學校計算機專業規劃教材

    作者:黃茹、王小銀、張麗麗
    出版社:清華大學出版社
    出版時間:2019年02月 


        
        
    "

    產品特色
    編輯推薦
    循序漸進地進入Linux環境下繫統級程序設計 
    內容簡介
    本書介紹使用C語言結合Linux API進行繫統級程序設計的方法,主要包括Linux基礎知識、C程序開發工具、文件及目錄管理、進程管理、重定向與管道、信號、進程間通信、線程、線程間的同步機制、網絡程序設計等10章,以及10個實驗,全面而繫統地介紹Linux操作繫統各種機制的實現原理、經常使用的繫統接口函數、繫統接口和命令程序之間的關繫以及命令程序的實現過程等。
    本書結構清晰,適合於教學,為各類高等學校開設開源軟件程序設計課程提供了一個切實可行的思路,同時也可作為培訓教材在各類培訓機構使用。書中各章節劃分明確,各章突出不同的重點,有利於教師組織安排授課內容;同時提供設計精美、內容豐富的電子教案以及教學素材供授課教師使用,有效地減輕了授課教師備課的工作量和強度。
    本書目標讀者為具有一定C語言基礎的讀者,適合各類高等院校的計算機及相關專業學生、Linux培訓機構、Linux API編程愛好者、Linux程序開發人員及愛好者學習使用。
    目錄
    目錄
    第1章Linux基礎知識/1
    1.1Linux簡介1
    1.1.1Linux繫統的發展1
    1.1.2與Linux相關的一些知識3
    1.2Linux繫統編程5
    1.2.1什麼是繫統編程5
    1.2.2繫統編程的學習內容及方法6
    1.2.3一個例子7
    1.2.4繫統調用和庫函數10
    1.3常用工具及命令10
    1.3.1命令格式10
    1.3.2常用工具11
    1.3.3常用命令15目錄
    第1章Linux基礎知識/1
    1.1Linux簡介1
    1.1.1Linux繫統的發展1
    1.1.2與Linux相關的一些知識3
    1.2Linux繫統編程5
    1.2.1什麼是繫統編程5
    1.2.2繫統編程的學習內容及方法6
    1.2.3一個例子7
    1.2.4繫統調用和庫函數10
    1.3常用工具及命令10
    1.3.1命令格式10
    1.3.2常用工具11
    1.3.3常用命令15
    1.3.4獲取幫助17
    1.4小結20
    習題20
    第2章C程序開發工具/22
    2.1編輯工具22
    2.1.1編輯工具介紹22
    2.1.2vi和vim程序編輯器25
    2.2gcc編譯器34
    2.3gdb調試器36
    2.3.1啟動和退出gdb37
    2.3.2顯示和查找程序源代碼38
    2.3.3執行程序和獲取幫助39
    2.3.4設置和管理斷點40
    2.3.5查看和設置變量的值45
    2.3.6控制程序的執行46
    2.4make和Makefile48〖1〗Linux環境高級程序設計目錄[3]〖3〗2.4.1make命令48
    2.4.2編寫Makefile文件50
    2.5小結54
    習題55
    第3章文件及目錄管理/56
    3.1文件和I/O操作分類56
    3.1.1文件概念56
    3.1.2文件操作分類56
    3.2Linux文件繫統概述58
    3.2.1文件結構58
    3.2.2文件繫統模型59
    3.2.3目錄、索引結點和文件描述符60
    3.2.4文件的分類63
    3.2.5文件訪問權限控制64
    3.3文件的讀寫68
    3.3.1文件打開、創建和關閉69
    3.3.2文件的讀寫72
    3.3.3文件讀寫指針的移動80
    3.3.4標準I/O的文件流82
    3.4文件屬性及相關繫統調用87
    3.4.1獲取文件屬性87
    3.4.2修改文件的訪問權限91
    3.4.3修改文件的用戶屬性93
    3.4.4獲取用戶的信息94
    3.4.5改變文件大小95
    3.4.6獲取文件的時間屬性96
    3.5目錄操作97
    3.5.1打開目錄97
    3.5.2讀取目錄項98
    3.5.3關閉目錄98
    3.6實現自己的ls命令100
    3.7小結105
    習題106
    第4章進程管理/107
    4.1Linux可執行程序的存儲結構與進程結構107
    4.1.1Linux可執行程序的存儲結構107
    4.1.2Linux繫統的進程結構109
    4.1.3進程樹110
    4.2進程的環境和進程屬性111
    4.2.1進程的環境111
    4.2.2進程的狀態112
    4.2.3進程的基本屬性115
    4.2.4進程的用戶屬性121
    4.3進程管理124
    4.3.1創建進程124
    4.3.2在進程中運行新代碼127
    4.3.3vfork函數131
    4.3.4進程退出133
    4.3.5wait函數138
    4.3.6Shell的實現流程142
    4.4Linux中的特殊進程143
    4.4.1孤兒進程143
    4.4.2僵尸進程144
    4.4.3守護進程145
    4.4.4出錯記錄148
    4.5小結150
    習題150
    第5章重定向與管道/151
    5.1重定向和管道命令151
    5.1.1重定向命令151
    5.1.2管道命令152
    5.2實現重定向153
    5.2.1重定向的實施者153
    5.2.2實現重定向的前提條件154
    5.2.3dup和dup2154
    5.2.4重定向的三種方法157
    5.2.5ls l>list.txt159
    5.3管道編程161
    5.3.1匿名管道161
    5.3.2命名管道165
    5.3.3ls l|grep root168
    5.3.4popen和pclose170
    5.4小結173
    習題174
    第6章信號/175
    6.1信號概述175
    6.1.1什麼是信號175
    6.1.2信號的來源和處理過程177
    6.1.3信號的處理方式177
    6.2早期信號處理函數——signal178
    6.2.1signal函數實現信號的三種處理方式178
    6.2.2signal函數存在的問題182
    6.3信號處理函數——sigaction183
    6.3.1sigaction繫統調用183
    6.3.2sigaction函數參數的說明186
    6.4信號其他相關函數190
    6.4.1kill與raise190
    6.4.2alarm與pause192
    6.4.3實現sleep函數193
    6.5小結194
    習題195
    第7章進程間通信/196
    7.1選擇進程間通信方式196
    7.1.1文件實現進程間通信196
    7.1.2命名管道實現進程間通信199
    7.2共享內存201
    7.2.1什麼是共享內存201
    7.2.2共享內存相關繫統調用203
    7.2.3共享內存實現進程間通信206
    7.2.4三種通信方式的比較208
    7.3信號量209
    7.3.1信號量及相關繫統調用209
    7.3.2使用信號量控制對共享內存的訪問214
    7.3.3信號量機制總結221
    7.4System V IPC222
    7.4.1Linux中的進程通信機制222
    7.4.2System V IPC概述223
    7.4.3IPC的標識符和鍵224
    7.5消息隊列225
    7.5.1消息隊列的概念225
    7.5.2消息隊列相關繫統調用226
    7.5.3使用消息隊列實現進程間通信229
    7.6小結232
    習題232
    第8章線程/233
    8.1線程概述233
    8.1.1線程的定義233
    8.1.2用戶級線程和內核級線程234
    8.1.3線程與進程的對比234
    8.2線程基本操作235
    8.2.1線程創建235
    8.2.2線程退出/等待238
    8.2.3線程終止244
    8.2.4線程掛起247
    8.2.5線程的分離249
    8.2.6線程的一次性初始化251
    8.2.7線程的私有數據253
    8.3線程屬性257
    8.3.1線程屬性對像258
    8.3.2設置/獲取線程detachstate屬性260
    8.3.3設置與獲取線程棧相關屬性261
    8.4線程應用舉例266
    8.5小結273
    習題273
    第9章線程間的同步機制/275
    9.1互斥鎖275
    9.1.1互斥鎖基本原理275
    9.1.2互斥鎖基本操作275
    9.1.3互斥鎖應用實例278
    9.2條件變量279
    9.2.1條件變量基本原理279
    9.2.2條件變量基本操作279
    9.2.3條件變量應用實例281
    9.3讀寫鎖284
    9.3.1讀寫鎖基本原理284
    9.3.2讀寫鎖基本操作284
    9.3.3讀寫鎖應用實例287
    9.4線程與信號289
    9.4.1線程信號管理290
    9.4.2線程信號應用實例291
    9.5小結295
    習題295
    第10章網絡程序設計/296
    10.1網絡知識基礎296
    10.1.1TCP/IP參考模型296
    10.1.2Linux中TCP/IP網絡的層結構296
    10.1.3TCP協議297
    10.1.4UDP協議298
    10.2套接字299
    10.2.1套接字概述299
    10.2.2套接字編程接口300
    10.2.3套接字通信流程303
    10.3套接字基礎307
    10.3.1套接字地址結構307
    10.3.2字節順序309
    10.3.3字節處理函數310
    10.4套接字編程311
    10.4.1基於TCP協議的網絡通信311
    10.4.2基於UDP協議的網絡通信316
    10.5小結319
    習題319
    附錄實驗/321
    實驗1Linux基礎知識321
    實驗2C程序開發工具321
    實驗3文件I/O操作322
    實驗4進程管理及守護進程323
    實驗5重定向和管道編程323
    實驗6信號安裝及處理方式324
    實驗7System V IPC進程通信325
    實驗8線程管理325
    實驗9線程間通信326
    實驗10套接字編程326
    前言
    前言
    出於安全、穩定等因素的考慮,開源軟件受到了各行各業的青睞,其中以Linux操作繫統為突出。作為當前為流行的操作繫統之一——Linux已發展得較為成熟,其良好的穩定性和優異的性能帶給各類用戶優越的體驗。Linux繫統的使用範圍越來越廣,隨之而來的是Linux環境下各類應用軟件需求的暴增。學習Linux環境編程對提高IT從業者的競爭力和整個軟件行業的發展無疑是相當有意義的。
    本書以培養Linux繫統程序分析能力為目標,以命令程序設計為驅動。在解決問題的過程中始終以培養分析問題的能力為基礎,介紹有效使用Linux在線手冊的方法,從而找到解決問題的突破口,進一步找到合適的繫統調用接口,設計相關的命令程序,終解決問題。
    C語言是廣大程序設計人員都已掌握的一門程序設計語言,同時也是實現Linux繫統所使用的程序設計語言。本書使用C語言結合Linux API進行程序設計,全書共分為10章,內容如下所述:
    第1章Linux基礎知識,介紹Linux操作繫統的發展情況以及繫統編程的概念,同時還介紹Linux繫統中的一些常用工具及命令。前言
    出於安全、穩定等因素的考慮,開源軟件受到了各行各業的青睞,其中以Linux操作繫統為突出。作為當前為流行的操作繫統之一——Linux已發展得較為成熟,其良好的穩定性和優異的性能帶給各類用戶優越的體驗。Linux繫統的使用範圍越來越廣,隨之而來的是Linux環境下各類應用軟件需求的暴增。學習Linux環境編程對提高IT從業者的競爭力和整個軟件行業的發展無疑是相當有意義的。
    本書以培養Linux繫統程序分析能力為目標,以命令程序設計為驅動。在解決問題的過程中始終以培養分析問題的能力為基礎,介紹有效使用Linux在線手冊的方法,從而找到解決問題的突破口,進一步找到合適的繫統調用接口,設計相關的命令程序,終解決問題。
    C語言是廣大程序設計人員都已掌握的一門程序設計語言,同時也是實現Linux繫統所使用的程序設計語言。本書使用C語言結合Linux API進行程序設計,全書共分為10章,內容如下所述:
    第1章Linux基礎知識,介紹Linux操作繫統的發展情況以及繫統編程的概念,同時還介紹Linux繫統中的一些常用工具及命令。
    第2章C程序開發工具,介紹Linux環境下編寫C語言程序所要用到的一些工具,包括vim、gcc、gdb、makefile等。
    第3章文件及目錄管理,介紹POSIX標準下文件的各類I/O操作以及與流文件的關繫和相互轉換。
    第4章進程管理,介紹在Linux環境中程序和進程的關繫、進程的基本屬性、一個進程從生到死的全過程,後介紹Linux繫統中的一些特殊進程。
    第5章重定向與管道,以實現重定向命令為引入點,重點介紹使用管道實現進程間通信的方法。
    第6章信號,介紹信號的幾種處理策略和信號在進程間通信中的使用方式。
    第7章進程間通信,介紹使用共享內存、信號量和消息隊列來實現進程間通信的方法,同時總結Linux環境下進程間通信的所有機制。
    第8章線程,介紹線程的基本概念和基本操作。
    第9章線程間的同步機制,介紹線程間的通信機制以及線程同步互斥的問題。〖1〗Linux環境高級程序設計前言[3]〖3〗第10章網絡程序設計,介紹套接字機制在不同主機的進程間如何實現通信以及在Linux環境下網絡套接字編程的基本方法。
    其中第5~7章以及第10章都是有關於進程間通信機制的內容。
    為檢查各章的學習情況,本書後配備了相應的實驗。
    作為Linux環境程序設計的入門教材,本書語言簡練、論述由淺入深,並輔以大量的示例程序和豐富的圖表,使讀者能夠更好地理解各種抽像的概念和關繫,幫助讀者理解全書內容。本書面向各類高等院校的計算機相關專業學生以及對開源環境程序設計有興趣的編程愛好者,要求讀者有一定的C語言編程基礎。書中除了講解程序的設計實現之外,著重講解解決問題的分析過程,力求使讀者掌握問題的分析方法,逐步培養讀者具有在Linux環境下獨立設計和實現應用級甚至繫統級程序的能力。
    需要說明的一點是,由於繫統調用從C語言語法的角度上來看與函數沒有區別,因此在本書中不會引起歧義的地方並沒有嚴格區分繫統調用和庫函數的表述。如果需要明確某一表述是繫統調用還是庫函數,可以使用man手冊查找。man手冊的第2章為繫統調用,第3章為庫函數。
    本書主要由黃茹主編,王小銀、張麗麗為副主編。其中黃茹編寫了第1、4、5、6、7章;王小銀編寫了第8、9、10章;張麗麗編寫了第2、3章;後由黃茹負責對全書進行了統稿。此外,在本書的編寫過程中,感謝陳莉君、舒新峰、劉霞林、王春梅對本書提出了寶貴的意見。
    盡管本書經過了編者反復的修改,但由於編者水平和經驗有限,時間倉促,書中難免存在錯漏之處,殷切希望廣大讀者批評指正。

    編者
    2019年1月
    在線試讀
    第5章重定向與管道在Linux繫統中,繫統會默認為命令或程序打開三個標準I/O文件,保證命令或程序可以與用戶進行交互。除此之外,還可以將這三個標準文件重定向,借此可以實現從指定的位置獲取輸入信息或將輸出信息、錯誤信息保存在指定的文件中。同時,Linux繫統還提供管道的功能,可以將多條命令或程序之間的輸出和輸入相銜接,實現靈活的Shell編程。
    5.1重定向和管道命令〖4/5〗5.1.1重定向命令所有的UNIX I/O重定向都是基於標準數據流的原理。在Shell中鍵入命令運行時,內核將會為命令進程打開三個標準I/O設備文件,並且用文件描述符0、1、2與它們關聯,其中文件描述符0對應標準輸入設備,1對應標準輸出設備,2對應標準錯誤文件。進程在運行過程中,默認從標準輸入設備文件讀取數據,將輸出數據寫入標準輸出設備文件,如果出錯的話,錯誤信息將會寫入標準錯誤文件。例如,使用cat命令時,繫統將會把結果顯示在標準輸出設備上。通常標準輸入設備文件為鍵盤,標準輸出設備文件和標準錯誤文件為顯示器,如圖5.1所示。
    圖5.1進程和標準設備文件的聯繫
    在某種情況下,用戶希望能夠將信息輸出到某個文件中,而不是顯示在標準輸出設備上,此時可以將該進程的標準輸出進行重定向。重定向命令分為輸入重定向、輸出重定向和錯誤重定向。〖1〗Linux環境高級程序設計第5章重定向與管道[3]〖3〗1. 輸入重定向
    輸入重定向使用符號“ ”來表示,它表示將進程的文件描述符0關聯到指定的文件上去。輸入重定向命令的格式為: command file例如,命令mail s test hr@163.com file就是一條輸入重定向命令,它表示以file文件為郵件內容,向hr@163.com郵箱發送一封標題為test的郵件。使用“ ”符號時,也可以把文件描述符0加在前面,例如,cat 0 file1,該命令同樣表示將cat命令的輸入重定向到file1文件。
    2. 輸出重定向
    符號“ ”或“ ”都可以用來表示輸出重定向,兩者的差異在於: 前者以覆蓋的方式輸出,後者以追加的方式輸出。輸出重定向命令的格式為: command file或 command file例如,命令cat file1 file2 file3表示將文件file1和file2的內容合並輸出到文件file3中,這條命令也可以使用以下兩條命令來替換: cat file1 file3
    cat file2 file3如果重定向使用的是符號“ !”,那麼表示輸出重定向強制覆蓋文件原有的內容。
    3. 錯誤重定向第5章重定向與管道在Linux繫統中,繫統會默認為命令或程序打開三個標準I/O文件,保證命令或程序可以與用戶進行交互。除此之外,還可以將這三個標準文件重定向,借此可以實現從指定的位置獲取輸入信息或將輸出信息、錯誤信息保存在指定的文件中。同時,Linux繫統還提供管道的功能,可以將多條命令或程序之間的輸出和輸入相銜接,實現靈活的Shell編程。
    5.1重定向和管道命令〖4/5〗5.1.1重定向命令所有的UNIX I/O重定向都是基於標準數據流的原理。在Shell中鍵入命令運行時,內核將會為命令進程打開三個標準I/O設備文件,並且用文件描述符0、1、2與它們關聯,其中文件描述符0對應標準輸入設備,1對應標準輸出設備,2對應標準錯誤文件。進程在運行過程中,默認從標準輸入設備文件讀取數據,將輸出數據寫入標準輸出設備文件,如果出錯的話,錯誤信息將會寫入標準錯誤文件。例如,使用cat命令時,繫統將會把結果顯示在標準輸出設備上。通常標準輸入設備文件為鍵盤,標準輸出設備文件和標準錯誤文件為顯示器,如圖5.1所示。
    圖5.1進程和標準設備文件的聯繫
    在某種情況下,用戶希望能夠將信息輸出到某個文件中,而不是顯示在標準輸出設備上,此時可以將該進程的標準輸出進行重定向。重定向命令分為輸入重定向、輸出重定向和錯誤重定向。〖1〗Linux環境高級程序設計第5章重定向與管道[3]〖3〗1. 輸入重定向
    輸入重定向使用符號“<”來表示,它表示將進程的文件描述符0關聯到指定的文件上去。輸入重定向命令的格式為: command 2. 輸出重定向
    符號“>”或“>>”都可以用來表示輸出重定向,兩者的差異在於: 前者以覆蓋的方式輸出,後者以追加的方式輸出。輸出重定向命令的格式為:  command>file或 command>>file例如,命令cat file1 file2>file3表示將文件file1和file2的內容合並輸出到文件file3中,這條命令也可以使用以下兩條命令來替換:  cat file1>file3
     cat file2>>file3如果重定向使用的是符號“>!”,那麼表示輸出重定向強制覆蓋文件原有的內容。
    3. 錯誤重定向
    錯誤重定向可以使用符號“2>”或“2>>”來表示,兩個符號的差異與輸出重定向類似。錯誤重定向的具體命令格式為:  command 2>file或command 2>>file使用錯誤重定向後,如果在命令執行的過程中有錯誤發生,錯誤信息將會記錄在文件file中。
    除了以上介紹的重定向符號外,還可以使用“>&”“1>”“2>&1”等符號。使用重定向符號時,也並不僅限於隻能在命令末尾處出現重定向符號。這些重定向符號可以單獨使用,也可以組合使用,例如:  wc result.wc 2>error.txt以上命令表示統計file1文件的字符、單詞和行數,將結果記錄在result.wc文件中,如果出錯,錯誤信息記錄在error.txt文件中。
    5.1.2管道命令
    如果某些數據必須要經過幾次命令操作之後纔能得到所想要的結果,此時可以使用管道符號將這些命令連接起來。管道命令會將符號先後的命令連接起來,將前一條命令的輸出作為後一條命令的輸入。符號“|”稱為管道操作符,管道命令的具體格式如下:      command1|command2|command3|……例如:      grep root /etc/passwd | sort圖5.2管道命令示意圖
    該命令表示在/etc/passwd文件中搜索出含有root的內容,並將這些內容排序。這條管道命令的示意圖如圖5.2所示。
    又如:  ls -l|grep hr|lpr該命令表示列出當前目錄中包含hr模式串的文件名稱,將結果打印出來。
    5.2實現重定向〖4/5〗5.2.1重定向的實施者在實現重定向命令之前,需要借由一個示例程序先來明確一下重定向是由待執行的命令或程序還是Shell來實現的。 \\[示例程序5.1 for_redirect.c\\]
     #include
     main(int argc, char  argv\\[ \\])
     {
     int i;
     char buf\\[80\\];
     scanf("%s",buf);
     printf("info from file:%s\\\
    ,buf);
     printf("arg list\\\
    );
     for(i=0;i printf("argv\\[%d\\]:%s\\\
    ,i,argv\\[i\\]);
     fprintf(stderr,"where do you find this?\\\
    );
     }在示例程序5.1中,分別使用scanf、printf和fprintf函數對標準輸入、標準輸出和標準錯誤文件進行了讀、寫操作,並且還使用printf函數輸出了執行程序時所附帶的參數。當使用兩種不同的方式來運行該程序時,請觀察一下重定向符號是否會被Shell當作參數傳遞給用戶程序。
    將程序編譯後按照帶重定向和不帶重定向兩種方式運行,得到結果如下:  root@ubuntu:~#./for_redirect para1 para2 para3
     Hello
     info from file:Hello
     arg list
     argv\\[0\\]:./for_redirect
     argv\\[1\\]:para1
     argv\\[2\\]:para2
     argv\\[3\\]:para3
     where do you find this?
     root@ubuntu:~#./for_redirect para1 para2 para3>result 2>err.txt
     Hello
     root@ubuntu:~#cat result
     info from file:Hello
     arg list
     argv\\[0\\]:./for_redirect
     argv\\[1\\]:para1
     argv\\[2\\]:para2
     argv\\[3\\]:para3
     root@ubuntu:~#cat err.txt
     where do you find this?從程序兩次運行的輸出結果來看,輸出的參數中並沒有重定向符號和文件名稱,因此可以確定: 重定向並不是由命令或用戶程序實現的,而是由Shell實現的。因此可以明確: 要實現重定向命令,就需要改寫第4章所編寫的簡單Shell程序,在Shell執行命令之前添加實現重定向的功能。
    5.2.2實現重定向的前提條件
    當著手設計帶有重定向功能的Shell程序時,還要謹記: 之所以能夠實現重定向,是因為Linux環境具有以下幾個特性:
    (1) 繫統為每個進程所打開的標準I/O設備文件對應著值小的三個文件描述符0、1、2。實際上一個進程打開的所有文件的信息是儲存在一個結構體數組之中的,而打開文件對應的文件描述符就是該文件信息在結構體數組中的存儲位置,即數組的下標。
    (2) 當進程使用open、dup等文件操作時,新分配的文件描述符遵循可用文件描述符原則。即當打開一個文件時,繫統為此文件安排的文件描述符總是可用的文件描述符中值小的那一個。
    (3) 在一個進程中,如果在文件打開操作以後使用了eXec族函數,那麼eXec函數將不會影響執行前打開的文件描述符集合。
    5.2.3dup和dup2
    dup和dup2是在Linux中實現重定向命令時經常會使用到的兩個函數。兩者都可用於復制文件描述符,dup函數的接口規範說明如表5.1所示。續表表5.1dup函數的接口規範說明
    函數名稱dup函數功能復制一個文件描述符頭文件#include函數原型int dup(int oldfd);參數oldfd:  被復制的文件描述符返回值>-1:   復制成功,返回新的文件描述符
    -1:     出錯dup函數用來復制一個文件描述符,參數oldfd指向一個打開的文件,函數的返回值返回復制後的新文件描述符,新的文件描述符也指向oldfd所指向的文件列表項,如圖5.3所示,如果該進程沒有打開其他文件,那麼在執行了dup(0)之後,文件描述符3將會指向0所對應的文件。
    圖5.3dup(0) 後文件描述符的關繫
    dup2也可用於復制文件描述符,它與dup的不同之處在於,dup2可以指定要把信息復制給哪一個文件描述符。dup2函數的接口規範說明如表5.2所示。表5.2dup2函數的接口規範說明
    函數名稱dup2函數功能復制一個文件描述符頭文件#include函數原型int dup2(int oldfd, int newfd);參數oldfd:  被復制的文件描述符
    newfd: 新的文件描述符返回值> -1:   復制成功,返回新的文件描述符
    -1:    出錯說明: dup2在復制文件描述符時,如果newfd已分配給某個打開的文件,那麼繫統會先關閉newfd,切斷與原先文件的聯繫,然後再進行復制。
    示例程序5.2說明了如何使用dup和dup2來復制文件描述符。 \\[示例程序5.2 exp_dup.c\\]
     #include
     #include
     #include
     #include
     
     main()
     {
     int fd,fd1,fd2;
     char buf\\[10\\];
     fd=open("text.txt",O_RDONLY);
     if(fd<0)
     {
     perror("open");
     exit(EXIT_FAILURE);
     }
     fd1=dup(fd);
     if(fd1<0)
     {
     perror("dup");
     exit(EXIT_FAILURE);
     }
     fd2=dup2(fd,5);
     if(fd2<0)
     {
     perror("dup2");
     exit(EXIT_FAILURE);
     }
     if(read(fd,buf,10)>0)
     write(STDOUT_FILENO,buf,10);
     if(read(fd1,buf,10)>0)
     write(STDOUT_FILENO,buf,10);
     if(read(fd2,buf,10)>0)
     write(STDOUT_FILENO,buf,10);
     close(fd);
     close(fd1);
     close(fd2);
     }編譯後運行,得到程序的運行結果如下:  root@ubuntu:~#cat text.txt
     This is a test text,
     Can you see my greeting?
     root@ubuntu:~#./exp_dup
     This is a test text,
     Can you s從運行結果可以看出,fd通過open函數分配給了文件text.txt,文件描述符fd1和fd2都復制了fd,因此三個文件描述符指向同一個文件。盡管fd、fd1和fd2是三個不同的文件描述符,但它們使用的是同一個打開的文件表項(struct file)。因此不管通過哪個文件描述符改變了文件讀寫指針的位置,都會對其他兩個文件描述符造成影響。從這個示例的運行結果也能夠看到,輸出結果並不是三次從頭開始的10個字符,而是從頭開始連續的30個字符。
    5.2.4重定向的三種方法
    通過上一節的學習,可以分析出實現重定向的流程: 0、1、2三個文件描述符原先是與標準I/O設備文件關聯的,需要重定向時,可以使用open、dup或dup2等函數將文件描述符0、1或2與指定的重定向文件相關聯,這樣就可以實現標準I/O設備文件的重定向。在Linux繫統中,可以使用三種方法來實現重定向功能,分別是:
     close then open: 關閉指定的標準I/O設備文件,打開重定向文件。
     open close dup close: 打開重定向文件,關閉指定的標準I/O設備文件,復制重定向文件的文件描述符,關閉步打開的文件描述符。
     open dup2 close: 打開重定向文件,將指定的標準I/O設備文件描述符作為參數,復制重定向文件的文件描述符,關閉步打開的文件描述符。
    針對以上三種重定向的方法,我們來一一講解。
    1. close then open
    在這種方法中,程序調用close函數關閉指定的文件描述符與標準設備文件的聯繫,此時該文件描述符就處於空閑可分配狀態;隨後使用open函數打開指定的重定向文件,由於open遵循可用文件描述符原則,打開的文件將獲得步操作釋放出來的文件描述符。示例程序5.3實現了將標準輸入重定向:  \\[示例程序5.3 exp_redirect1.c\\]
     #include
     #include
     #include
     main()
     {
     int fd;
     char buf\\[80\\];
     close(0);
     if((fd=open("./text.txt",O_RDONLY))!=0)
     {
     perror("open");
     exit(EXIT_FAILURE);
     }
     read(0,buf,80);
     write(1,buf,80);
     }該程序將標準輸入重定向到當前目錄中的text.txt文件,從中讀取80個字節的數據,輸出在標準輸出設備上。文件描述符0關聯的文件變化情況如圖5.4所示。
    圖5.4close then open方法的示意圖
    2. open close dup close
    這種方法首先使用open函數打開指定的重定向文件,獲取該文件的文件描述符fd;隨後,使用close函數關閉標準I/O文件,釋放其對應的文件描述符;之後使用dup函數復制fd,此時由於dup函數遵循可用文件描述符原則,因此將會把fd復制給第二步中close釋放出來的文件描述符;後使用close關閉fd即可。示例程序5.4使用第二種方法來實現重定向,其功能和示例程序5.3一樣,將輸入重定向到當前目錄中的text.txt文件上。 \\[示例程序5.4 exp_redirect2.c\\]
     main()
     {
    int fd,newfd;
    char buf\\[80\\];
    fd=open("./text.txt ",O_RDONLY);
    close(0);
    newfd=dup(fd);
    if(newfd!=0)
    {
    perror("dup");
    exit(EXIT_FAILURE);
    }
    close(fd);
    read(0,buf,80);
    write(1,buf,80);
     }在這個示例程序中,文件描述符關聯文件的變化情況如圖5.5所示。
    圖5.5open close dup close的過程
    3. open dup2 close
    這種方法與open close dup close方法類似,不同之處在於,使用dup2將open close dup close方法的第二步和第三步合而為一,直接關閉了標準I/O文件並進行了文件描述符的復制。示例程序5.5為使用方法三實現輸入重定向的代碼。 \\[示例程序5.5 exp_redirect3.c\\]
     main()
     {
    int fd,newfd;
    char buf\\[80\\];
    fd=open("./text.txt ",O_RDONLY);
    newfd=dup2(fd,0);
    if(newfd!=0)
    {
    perror("dup2");
    exit(EXIT_FAILURE);
    }
    close(fd);
    read(0,buf,80);
    write(1,buf,80);
     }以上三種方法均可以實現重定向操作,具體使用哪種方法可以根據實際情況來決定。如果已知重定向文件的文件名,那麼三種方法都可以實現;但如果在程序運行過程中隻能獲取重定向文件的文件描述符,那麼就要考慮使用後面兩種方法。
    5.2.5ls l>list.txt
    為了使讀者能夠更好地掌握如何在簡單Shell中實現重定向功能,我們先來學習一個具體的重定向命令如何實現:  ls -l>list.txt首先,先來分析一下Shell在實現ls l命令時的過程是怎樣的。從第4章了解到當Shell執行一條前臺命令時,將會為命令創建一個子進程;隨後在進程中使用eXec函數來執行命令程序,此時Shell進程處於阻塞狀態等待命令進程結束;當命令進程結束後,Shell將會顯示命令進程運行的結果。從這個過程中可以發現:
    (1) 命令進程需要進行重定向,但是Shell進程並不需要重定向。
    (2) 為了執行命令,Shell需要調用fork函數創建子進程,子進程需要調用eXec函數來執行ls l命令。這就要求必須在創建了子進程之後,調用eXec函數之前將子進程的輸出重定向到文件list.txt。這樣一來,重定向僅僅是針對子進程的,並且子進程在調用eXec函數時,並不會影響到在eXec函數執行前已打開的文件描述符列表。
    (3) 由於list.txt有可能是一個不存在的文件,還需要將重定向的三種方法中的open函數換成creat函數。
    程序代碼如示例程序5.6所示。  \\[示例程序5.6 exp_lsre.c\\]
     main()
     {
    int pid,fd;
    printf("This is to show how to redirect!\\\
    );
    if((pid=fork())==-1)
    {
    perror("fork");
    exit(EXIT_FAILURE);
    }
    else if(pid==0)
    {
    close(1);
    fd=creat("list.txt",0644);
    if(execlp("ls","ls","-l",NULL)<0)
    {
    perror("exec");
    exit(EXIT_FAILURE);
    }
    }
    else if(pid!=0)
    {
    wait(NULL);
    system("cat list.txt");
    }
    }示例程序5.6使用了close then open來實現重定向。請讀者思考一下,命令ls l>>list.txt、ls l 2>err.txt應該如何實現?
    從示例程序5.6中,可以分析出在簡單Shell程序中實現重定向的流程如下:
    (1) 以字符串的方式讀入命令後,將命令字符串分解為命令名稱、參數、選項、重定向等各個分項。
    (2) 如果存在重定向符號,則需要根據重定向符號的類型,分解出重定向文件名和需要重定向的標準I/O文件。
    (3) 調用fork創建子進程,在子進程中按照重定向的要求,重定向標準I/O文件,父進程調用wait等待子進程結束。

















     
    網友評論  我們期待著您對此商品發表評論
     
    相關商品
    在線留言 商品價格為新臺幣
    關於我們 送貨時間 安全付款 會員登入 加入會員 我的帳戶 網站聯盟
    DVD 連續劇 Copyright © 2024, Digital 了得網 Co., Ltd.
    返回頂部