linux popen函式
include <stdio.h>
FILE *popen(const char *command, const char *type);
描述
popen() 函式建立一個管道 ,然後fork一個子程序, 並呼叫 shell. 因為 管道是被定義成單向的, 所以 type 引數 只能定義成 只讀或者只寫, 不能是兩者同時, 結果流也相應的是隻讀 或者 只寫.
command 引數 是 一個 字串指標, 指向的是一個 以 null 結束符 結尾的字串, 這個字串包含 一個 shell 命令. 這個命令 被送到 /bin/sh 以-c 引數 執行, 即由 shell 來執行.
type 引數 也是 一個 指向 以 null 結束符結尾的 字串的指標, 這個字串 必須是 "r" 或者 "w" 來指明 是 讀還是寫.
popen() 函式 的 返回值 是一個普通的 標準I/O流, 它只能用pclose() 函式 來關閉, 而不是fclose(). 函式. 向這個流 的 寫入被轉化為 對 command 命令的標準輸入; 而 command 命令的 標準輸出 則是和 呼叫popen(),
函式 的 程序 相同,除非 這個被command命令 自己改變. 相反的, 讀取 一個 “被popen了的” 流, 就相當於 讀取 command 命令的標準輸出, 而 command 的標準輸入 則是和 呼叫popen
注意, popen 函式的 輸出流預設是被全緩衝的.
include <stdio.h>
int pclose(FILE *stream);
描述
pclose 函式 等待 相關的程序結束並返回 一個 command 命令的 退出狀態。
下面看一個例子:
#include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main( void ) { FILE *stream; FILE *wstream; char buf[1024]; memset( buf, '/0', sizeof(buf) ); //初始化buf,以免後面寫如亂碼到檔案中 stream = popen( "ls -l", "r" ); //將“ls -l”命令的輸出 通過管道讀取(“r”引數)到FILE* stream wstream = fopen( "test_popen.txt", "w+"); //新建一個可寫的檔案 fread( buf, sizeof(char), sizeof(buf), stream); //將剛剛FILE* stream的資料流讀取到buf中 fwrite( buf, 1, sizeof(buf), wstream ); //將buf中的資料寫到FILE *wstream對應的流中,也是寫到檔案中 pclose( stream ); fclose( wstream ); return 0; }
[[email protected] src]# gcc popen.c
[[email protected] src]# ./a.out
[[email protected] src]# cat test_popen.txt
總計 128
-rwxr-xr-x 1 root root 5558 09-30 11:51 a.out
-rwxr-xr-x 1 root root 542 09-30 00:00 child_fork.c
-rwxr-xr-x 1 root root 480 09-30 00:13 execve.c
-rwxr-xr-x 1 root root 1811 09-29 21:33 fork.c
-rwxr-xr-x 1 root root 162 09-29 18:54 getpid.c
-rwxr-xr-x 1 root root 1105 09-30 11:49 popen.c
-rwxr-xr-x 1 root root 443 09-30 00:55 system.c
-rwxr-xr-x 1 root root 0 09-30 11:51 test_popen.txt
-rwxr-xr-x 1 root root 4094 09-30 11:39 test.txt
小結:popen()函式的工作原理
1、使用pipe()建立匿名管道;父程序關掉管道的其中一端;(父程序使用哪一端依據type引數而定)
2、使用fork()建立子程序,子程序關掉管道的另一端;子程序將標準輸出(或標準輸出)重定向到管道的”寫“(或”讀“)端;
3、在子程序中呼叫exec族函式執行commond命令,通過管道將結果傳送至父程序
4、父程序將管道的”讀“(或”寫“)端檔案描述符轉換為檔案流指標。
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114857.html相關推薦
Linux popen函式的使用總結
函式原型: #include “stdio.h” FILE *popen( const char* command, const char* mode ) 引數說明: command: 是一個指向以 NULL 結束的 shell 命令字串的指標。這行命
linux popen函式
include <stdio.h>FILE *popen(const char *command, const char *type);描述 popen() 函式建立一個管道 ,然後fork一個子程序, 並呼叫 shell. 因為 管道是被定義成單向
linux裡 popen函式的作用
函式原型: #include “stdio.h” FILE *popen( const char *command, const char* mode ) int pclose(FILE *stream_to_close);引數說明: command: 是
Linux 下 popen 函式引起的殭屍程序 defunct 以及解決辦法
在使用 popen 函式的時候,如果不注意的話,可能會引起殭屍程序 defunct 的存在,雖然該程序不佔用記憶體和 CPU,但是會在程序任務管理樹上佔用一個寶貴的節點。這樣就造成了程序名額的資源浪費,所以一定得處理殭屍程序! 下面以 python 為例來
linux C程式設計--popen函式詳解
#include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); 描述 popen() 函式 用 建立管道 的 方式 啟動一個 程序, 並呼叫 shell. 因為 管道
Linux下system與popen函式
曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所執行命令的返回值以及命令執行失敗原因如何定位,這才是重點。當初因為這個函式風險較多,故拋棄不用,改
Linux中的popen函式和system函式
說在前面:在實際程式設計中儘量減少使用system函式。int system(const char *command);說明: system()通過呼叫/ bin / sh -c命令執行命令中指定的命令,並在命令完成後返回。在執行該命令期間,SIGCHLD將被阻塞,並且SIG
Linux popen和pclose函式
popen和pclose 標頭檔案 #include <stdio.h> 函式原型 FILE *popen(const char *command, const char *type)
Linux pipe函式
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
linux C函式之stat函式
1.函式功能: 通過檔名filename獲取檔案資訊,並儲存在buf所指的結構體stat中 2.函式原型 1)函式標頭檔案 #include <sys/stat.h> #include <unistd.h> 2)函式 int stat(const c
Linux系統函式read()/write()/pread()/pwrite()的區別
轉載地址:https://blog.csdn.net/u013525455/article/details/52661313 在Linux和UNIX中有很多的輸入輸出函式,有時真是讓想跟它攀點關係的菜鳥們束手無策。先來看看都有哪些函式,通過解析與總結,看看能不能讓大家能這些函式有個理性的認識,哦
常見的linux系統函式
linux的系統呼叫是指是使用者程序通過gate和trap方式呼叫核心功能的介面 具體步驟 執行使用者程式(例如fork) 根據glibc函式實現取系統呼叫號並執行int $0x80產斷 進行址空間轉換堆疊切換執行SAVE_ALL(進行核心模式) 進行斷處理
Linux C 函式速查
...abs abs(計算整型數的絕對值) 相關函式 labs, fabs 表頭檔案 #include<stdli
【轉】Linux C函式庫參考
asctime(將時間和日期以字串格式表示)clock(取得程序佔用CPU的大約時間)ctime(將時間和日期以字串格式表示)difftime(計算時間差距)ftime(取得目前的時間和日期)gettimeofday(取得目前的時間)gmtime(取得目前的時間和日期)loca
往linux核心函式掛鉤子
概述 本文講解替換一個已經在記憶體中的函式,使得執行流流入我們自己的邏輯,然後再呼叫原始的函式。比如有個函式叫做funcion,而你希望統計一下呼叫function的次數,最直接的方法就是如果有誰呼叫function的時候,調到下面這個函式就好了。 void new_function()
Linux --------fork()函式:(一)
fork()函式: 一:介紹 fork是在程序管理模組中的一個重要的函式。那麼怎樣來建立程序呢? ①:程式----- (執行)-----》程序 ./main ②:由程式建立程序 pid_t fork(void) 二:函式簡介 1.描述:一個現有
linux C函式之access函式的用法【轉】
1.函式功能: 檢查呼叫程序是否可以對指定的檔案執行某種操作。 2.函式原型: 1)函式標頭檔案 #include <stdio.h> #include <unistd.h> 2)函式 int access(
linux select函式詳解
在Linux中,我們可以使用select函式實現I/O埠的複用,傳遞給 select函式的引數會告訴核心: •我們所關心的檔案描述符 •對每個描述符,我們所關心的狀態。(我們是要想從一個檔案描述符中讀或者寫,還是關注一個描述符中是否出現異常)
linux計算函式執行時間
#ifndef _TIME_USED_H_ #define _TIME_USED_H_ #include <stdio.h> #include <sys/time.h> //
Linux 命令/函式 收集
常用的名詞解釋: UID是使用者ID,PID是程序ID,PPID是父程序ID。 UID 使用者身份證明(User Identification)的縮寫。UID使用者在註冊會員後,系統會自動的給你一個UID的數值。意思就是給這名使用者編個號。 比如,甲在論壇註