1. 程式人生 > >popen函式執行命令,讀取流資料

popen函式執行命令,讀取流資料

描述

popen() 函式 用 建立管道 的 方式啟動一個 程序, 並呼叫 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 函式的 輸出流預設是被全緩衝的.

pclose 函式 等待 相關的程序結束並返回 一個 command 命令的 退出狀態, 就像 wait4

 函式 一樣

本文介紹了popen函式的使用方法和行為機理,並給出實際的例子來輔助說明了popen函式的使用方法。
檔案中還介紹了幾個檔案操作的函式,如fopen,fread,fwrite等
   
作者:zieckey (http://zieckey.cublog.cn)
    All Rights Reserved!

popen使用FIFO管道執行外部程式。

#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

popen 通過type是r還是w確定command的輸入/輸出方向,r和w是相對command的管道而言的。r表示command從管道中讀入,w表示 command通過管道輸出到它的stdout,popen返回FIFO管道的檔案流指標。pclose則用於使用結束後關閉這個指標。



下面看一個例子:

/*******************************************************************************************
** Name:popen.c
**      This program is used to show the usage of popen() .
** Author:zieckey,([email protected])
** Date:2007/9/30 11:47
** All rights reserved!
*******************************************************************************************/
#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

int Volume::createDeviceNode(const char *path, int major, int minor) {
    mode_t mode = 0666 | S_IFBLK;
    dev_t dev = (major << 8) | minor;
    if (mknod(path, mode, dev) < 0) {
        if (errno != EEXIST) {
            return -1;
        }
    }
    if ( NAND_DEVID == major ) {
        //if it is nand flash, create a char device node for format
        mode = 0666 | S_IFCHR;
        dev = (90 << 8) | 2*minor;
        char chDev[255] = {0};
        snprintf(chDev, sizeof(chDev), "/dev/block/vold/c%d:%d", 90, 2*minor);
        if (mknod(chDev, mode, dev) < 0) {
            if (errno != EEXIST) {
                return -1;
            }
        }
    }


    char cmdStr[255] = {0};
    char resStr[255] = {0};
    FILE   *stream = NULL ;
    snprintf( cmdStr, sizeof(cmdStr), "%s %s", "/system/bin/blkid", path );


    stream = popen( cmdStr, "r" );
    if ( stream )
    {
        if ( 0 < fread( resStr, sizeof(char), sizeof(resStr),  stream) ) {
            char * pType = NULL;
            if ( pType = strstr( resStr, " TYPE=") ) {
                pType += 7;
                char * pQuote = NULL;
                if ( pQuote = strchr( pType, '"' ) ) {
                    (*pQuote) = 0;
                    if ( 0 == strncmp("ntfs", pType, sizeof("ntfs")) )
                        mbGetLabel = true;
                    else if ( 0 == strncmp("vfat", pType, sizeof("vfat")) )
                        mbGetLabel = true;
                    else if ( 0 == strncmp("ext2", pType, sizeof("ext2")) )
                        mbGetLabel = true;
                    else if ( 0 == strncmp("ext3", pType, sizeof("ext3")) )
                        mbGetLabel = true;
                    else if ( 0 == strncmp("ext4", pType, sizeof("ext4")) )
                        mbGetLabel = true;
                }
            }
        }
        pclose( stream );
    }


    if( mbGetLabel = ( mbGetLabel || 31 == major ) )
    {
        getPartitionLabel();
    }


    return 0;
}

相關推薦

popen函式執行命令讀取資料

描述 popen() 函式 用 建立管道 的 方式啟動一個 程序, 並呼叫 shell. 因為 管道是被定義成單向的, 所以 type 引數 只能定義成 只讀或者 只寫, 不能是 兩者同時, 結果流也相應的 是隻讀 或者 只寫. command 引數 是 一個 字串指

popen()函式執行指令碼要用pclose()函式關閉

就像百度百科中所說popen()函式通過建立一個管道,呼叫fork()產生一個子程序,執行一個shell以執行命令來開啟一個程序。這個管道必須由pclose()函式關閉。 其中”必須由pclose()函式關閉“是一個容易被忽視的點,這不光光浪費資源的問題,更涉及到子程序的週

java下執行DOS命令讀取輸出

最近在學習DOS命令,覺得應該做一個客戶端來執行DOS命令,恰好學習過java,就使用java執行DOS命令, 在網上查找了許久,發現大同小異,不過還是要感謝大家的分享。 關於怎麼運用,我總結了一下幾點: 關鍵點 1.java下怎麼執行DOS命令 Process pro

ORACLE DBA工具收集(Oracle DUL/AUL/ODU 恢復工具可以脫離Oracle執行環境直接從資料檔案中讀取記錄)

    遇到效能問題要進行調優時, 常常不知道要怎麼調優, 原因是不知道在哪兒出現了效能問題, 所以需要藉助於有效的效能工具. oramon是一個很有效的效能資料收集工具, 從基本效能檢視(如V$SYSSTAT和V$SESSION等)中取出有效的效能資料, 進行橫向縱向聯合比較分析, 如不同時間點的邏輯

通過python socket遠程執行命令並返回值

python socket #!/usr/bin/env python# TCP-Serverimport socketimport subprocesssk_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sk_obj.bind((‘12

expect實現自動scp和ssh登錄後執行命令並向bash提供返回值

ip地址 用戶名 expect 密碼 #!/bin/bash # 全局變量:用戶名,普通用戶密碼,root密碼 loginname="xxxx" userpwd="xxxx" rootpwd="xxxx" # 讀取iplist(逐行存儲IP地址) cat /root/iplist | whi

分發系統expect遠程登錄執行命令傳遞參數

分發系統expect遠程登錄 執行命令自動退出 傳遞參數 分發系統:shell 上線腳本expect實現遠程傳輸文件,執行命令,系統上線等功能expect 腳本遠程登錄vim 1.expect#! /usr/bin/expectset host "192.168.91.129"

分發系統介紹expect腳本遠程登錄expect腳本遠程執行命令expect腳本傳遞參數

expect分發系統介紹 當我們要上線一個新代碼的時候,如果機器少,我們的工作量不會很大,很容易完成,如果設備很多,有幾十臺,上百臺的話,那我們的工作量會非常大,而且也不規範,這時,我們就可以用可以用開源的軟件,expect腳本語言,進行實現分發系統的功能。 expect腳本遠程登錄首先yum安裝expect

分發系統介紹expect腳本遠程登錄 expect腳本遠程執行命令 expect腳本傳遞參數

expect shell 分發系統介紹 當我們要上線一個新代碼的時候,如果機器少,我們的工作量不會很大,很容易完成,如果設備很多,有幾十臺,上百臺的話,那我們的工作量會非常大,而且也不規範,這時,我們就可以用可以用開源的軟件,expect腳本語言,進行實現分發系統的功能。 expect腳本遠程登錄 首

分發系統-expect講解expect腳本遠程登錄expect腳本遠程執行命令expect腳本

ssh 傳遞 memory stat 講解 mod 同步 print 業務 分發系統-expect講解 業務越來越大,網站app,後端,編程語言是php,所以就需要配置lamp或者lnmp,最好還需要吧代碼上傳到服務器上;但是因為業務增加,代碼增加,多臺機器,就會非常麻煩

python 通過 subprocess 執行命令重定向實時輸出

out www. stdout err stderr class 解碼 Coding ces 環境:python 3.6 下面的例子,通過 subprocess 執行命令,重定向並實時輸出,可修改重定向到文件或其他。 (註意:例子只適用於,遇到錯誤就停止執行的命令。

crontab 定時執行命令引數解釋如何結合PHP artisan執行crontab -e -l等 分 時 日 月 周 commands

請認真閱讀下面文字: crontab命令用於安裝、刪除或者列出用於驅動cron後臺程序的表格。使用者把需要執行的命令序列放到crontab檔案中以獲得執行。     每個使用者都可以有自己的crontab檔案。/var/spool/cron下的crontab檔案不可以直接

遠端執行命令監控伺服器

http://a.scwy.net/blog/doc/177 通過ssh,遠端監控伺服器,獲取伺服器資訊。這裡主要是作一下記錄,怕忘。 for ((c=1;;i++)); do sshpass -p 1234567 ssh [email protected] "uptime

Python 多執行(全域性變數)資料共享threading.Lock() 互斥鎖

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

C#讀取csv讀取一行資料的異常問題處理。

多語言檔案 這版用csv格式存放, 自己用C#寫輔助工具時,發現遇到各種問題。 (暫時沒找開源庫,如果有其實直接就行了)。 講一講遇到的幾個坑吧: 1.csv 這邊用 半形逗號, 間隔單元格, 所以如果文字中有半形,  "   則這個單元格的資料前後會加上雙引號 "",

C#儲存資料到檔案讀取檔案資料

#region 檔案讀取與儲存 /// <summary> /// 獲取檔案中的資料串 /// </summary> public static string fileToString(String filePath) { string s

sudo執行命令xx is not in the sudoers file. This incident will be reported.解決

使用sudo執行root許可權才能執行的命令時,輸入密碼後執行被終止,命令列提示: xx is not in the sudoers file. This incident will be reported. 即:xx不在 sudoers 檔案中。此事將被報告。 這個

sudo命令用其他身份來執行命令限制root遠端登入詳解

一,命令sudo 命令語法 sudo(選項)(引數) 命令描述 sudo命令用來以其他身份來執行命令,預設的身份為root。 使用者使用sudo時,必須先輸入密碼,之後有5分鐘的有效期限,超過期限則必須重新輸入密碼。 命令選項 -b:

JAVA反射機制示例讀取excel資料對映到JAVA物件中

import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j

systemverilog-modelsim中執行命令時間精度,include

在modelsim 10.2中能模擬執行systemverilog檔案,輸出結果是在transcript的命令列。 .do中命令為:vlog -sv file_path,  examp: vlog -sv -quiet  /ifn/mns/my_top.sv 推薦一個學習s