自己實現popen函式

2021-06-26 09:37:26 字數 2195 閱讀 8229

閒來無事,自己實現了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...