閒來無事,自己實現了popen函式mypopen,後來檢視了popen函式的原始碼發現自己實現的與其相差無幾,本函式與linux中的實現最大的不同是不需要用專門的pclose()函式來關閉檔案指標,用普通的fclose()即可,linux實現的**也會給出在下文,可以對比一下其中差異。
主要通過pipe管道實現,具體思路如下:
1、使用pipe()建立管道
2、使用fork()建立子程序
3、在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序
4、在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標
下面是mypopen源**,重點部位已通過注釋進行標註:
[cpp]view plain
copy
file
*mypopen(
char
*cmd,
char
type)
if(pipe(pipefd)<0)
//建立管道
pid_t=fork(); //建立子程序
if(pid_t < 0)
return
null;
if(0 == pid_t)
//子程序中......
else
char
*argv = ;
if(execvp(cmd,argv)<0)
//用exec族函式執行命令
return
null;
} wait(0); //等待子程序返回
if(type==
'r')else
} 下面是popen()在linux中的實現:
[cpp]view plain
copy
/** popen.c written by w. richard stevens
*/#include
#include
#include
#include "ourhdr.h"
static
pid_t *childpid = null;
/* ptr to array allocated at run-time */
static
intmaxfd;
/* from our open_max(), */
#define shell "/bin/sh"
file
* popen(const
char
*cmdstring,
const
char
*type)
if(childpid == null)
if(pipe(pfd) < 0)
return
(null);
/* errno set by pipe() */
if( (pid = fork()) < 0)
return
(null);
/* errno set by fork() */
else
if(pid == 0)
} else
} /* close all descriptors in childpid */
for(i = 0; i < maxfd; i++)
if(childpid[ i ] > 0)
close(i);
execl(shell, "sh"
, "-c"
, cmdstring, (
char
*) 0);
_exit(127);
} /* parent */
if(*type ==
'r') else
childpid[fileno(fp)] = pid; /* remember child pid for this fd */
return
(fp);
} int
pclose(file
*fp)
參考資料,真誠致謝:
popen函式的實現
注 本文 本人有修改對 open max 的呼叫 popen函式的實現包括一下幾步 1 使用pipe 建立管道 2 使用fork 建立子程序 3 在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序 4 在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標 類似與s...
popen函式的實現
popen函式的實現包括一下幾步 1 使用pipe 建立管道 2 使用fork 建立子程序 3 在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序 4 在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標 類似與system fork與exec函式的組合 pope...
使用popen函式實現分頁顯示
include include include apue.h include include include include include include define pager int main int argc char argv if ferror fpin err sys fgets e...