popen函式執行命令,讀取流資料
描述
popen() 函式 用 建立管道 的 方式啟動一個 程序, 並呼叫 shell. 因為 管道是被定義成單向的, 所以 type 引數 只能定義成 只讀或者 只寫, 不能是 兩者同時, 結果流也相應的 是隻讀 或者 只寫.
command 引數 是 一個 字串指標, 指向的是一個 以 null 結束符 結尾的字串, 這個字串包含 一個 shell 命令. 這個命令 被送到 /bin/sh 以 -c 引數 執行, 即由 shell 來執行. type 引數 也是 一個 指向 以 null 結束符結尾的 字串的指標, 這個字串 必須是 'r' 或者 'w’ 來指明 是 讀還是寫.
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