unix系統程式設計

2022-10-08 16:09:15 字數 1134 閱讀 1244

【popen &pclose】

popen介面定義:

#include file *popen(const char *command, const char *type);

int pclose(file *stream);

popen函式會建立乙個管道,並且建立乙個子程序來執行shell,shell會建立乙個子程序來執行command,

根據type的值不同,分成兩種情況:

如果type是r: command執行的標準輸出,就會寫入管道,從而被呼叫popen的程序讀到,通過對popen返

回的file型別指標執行read或fgets操作,就可以讀取到command的標準輸出。

如果type是w:呼叫popen的程序可以通過對file型別指標執行write、fputs等操作,負責往管道裡面寫

入,寫入的內容經過管道傳遞給執行command的程序,作為命令的的輸入。

popen函式成功時,會返回stdio庫封裝的file型別的指標,失敗時會返回null,並且設定errno,

常見的失敗有fork失敗、pipe失敗,或者分配記憶體失敗。

i/o結束後,可以呼叫pclose函式來關閉管道,並且等待子程序的退出。pclose函式成功時會返回

子程序shell的終止狀態。popen函式和system函式類似,如果command對應命令無法執行,就如同

執行了exit(127)一樣,如果發生其它錯誤,pclose函式則返回-1.可以從errno中獲取到失敗的原因。

命令執行後需要獲取命令的返回值,可以通過如下幾個巨集來獲取:

1. 程序正常退出

wifexited(status) : 如果子程序正常退出,則返回true,否則返回false

wexitstatus(status):如果子程序正常退出,則本巨集用來獲取程序的退出狀態

2. 程序收到訊號,導致退出

wifsignaled(status) : 如果程序是被訊號殺死的,則返回true,否則返回false

wtremsig(status):如果程序是被訊號殺死的,則返回殺死程序訊號的值

wcoredump(status) : 如果子程序產生了core dump,則返回true,否則返回false

UNIX系統程式設計1

man 你想查詢的內容 如果man你也不會用也不要緊,那你就 man man 一下,呵呵。只可惜好像還沒有翻譯成中文,對於像我這樣英文水平還有待提高的朋友來說讀起來有點麻煩。最後還有乙個好工具就是網路,有什麼不會的google一下好多問題都能解決。好,囉嗦的半天,說歸正傳,免得給大家造成光說不練的印...

Unix系統程式設計()brk,sbrk

在堆上分配記憶體 程序可以通過增加堆的大小來分配記憶體,所謂堆是一段長度可變的連續虛擬記憶體,始於程序的未初始化資料段末尾,隨著記憶體的分配和釋放而增減。通常將堆的當前記憶體邊界稱為 program break 下面也會學習一族函式brk,sbrk和malloc。調整program break br...

Unix系統程式設計()lseek系統呼叫

之前知道lseek這個系統呼叫可以改變檔案的偏移量,或者叫偏移量或指標。檔案偏移量是指執行下乙個read或者write操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。檔案第乙個位元組的偏移量為0。檔案開啟時,會將檔案偏移量設定為指向檔案的開始,以後每次read或write呼叫將自動...