1. 程式人生 > >linux popen函式

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. 因為 管道是被定義成單向

linuxpopen函式的作用

函式原型:  #include “stdio.h”  FILE *popen( const char *command, const char* mode )        int pclose(FILE *stream_to_close);引數說明:  command: 是

Linuxpopen 函式引起的殭屍程序 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的數值。意思就是給這名使用者編個號。 比如,甲在論壇註