在Linux編程中,經常要調用一些系統命令或SHELL指令碼來協助我們完成一些操作,大部分情況下system函數可以勝任,但有時在操作完成之後,我們還要擷取它的輸出,這時system函數就無能為力了。為此我編寫了一個函數,可以先讓系統執行一條命令,然後利用管道技術擷取它的輸出。上代碼:
#include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXLINE 1024 //調用系統命令,並擷取輸出(相當於使用system) //input: 要調用的系統命令 //output: 調用命令後系統的輸出 //maxlen: 輸出字串的最大長度 int mysystem(char *input, char *output, int maxlen) { if( NULL==input || NULL==output ) return -1; int reslen; FILE *stream; memset(output, 0, maxlen); //建立管道,並將input裡的內容寫入管道 stream = popen(input, "r"); //從管理中讀出資料,並寫入output數組 reslen = fread(output, sizeof(char), maxlen, stream); pclose(stream);return reslen; } int main(int argc, char **argv) { if( argc != 2 ){fprintf(stderr, "Using: ./mysystem <cmd>\n");exit(1);}char output[MAXLINE]; mysystem(argv[1], output, MAXLINE); printf("The result of '%s' is: \n%s", argv[1], output); return 0; }
運行樣本:qch@ubuntu:~/code$ gcc temp.c -o temp
qch@ubuntu:~/code$ ./temp pwd
The result of 'pwd' is:
/home/qch/code