popen函式的實現

2021-07-10 02:22:43 字數 1664 閱讀 7668

【注】本文**:

本人有修改對

open_max()的呼叫

popen函式的實現包括一下幾步:

1、使用pipe()建立管道

2、使用fork()建立子程序

3、在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序

4、在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標

類似與system(fork與exec函式的組合),popen在啟動另外乙個執行緒時,該執行緒有可能啟動失敗或者popen執行shell時失敗了,但這個時候popen本身不會報錯,直接就造成呼叫popen的父程序卡住了。可以通過驗證errno來避免。

下面是popen()在linux中的實現:

/* 

* popen.c written by w. richard stevens

*/

#include #include #include //#include "ourhdr.h"

#include static pid_t *childpid = null;

/* ptr to array allocated at run-time */

static int maxfd; /* from our open_max(), */

#define shell "/bin/sh"

file *

popen(const char *cmdstring, const char *type)

if (childpid == null)

maxfd = limit.rlim_cur;

//print("rlimit = %d.\n", maxfd);

#endif

if ( (childpid = calloc(maxfd, sizeof(pid_t))) == null)

return(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函式的實現

popen函式的實現包括一下幾步 1 使用pipe 建立管道 2 使用fork 建立子程序 3 在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序 4 在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標 類似與system fork與exec函式的組合 pope...

自己實現popen函式

閒來無事,自己實現了popen函式mypopen,後來檢視了popen函式的原始碼發現自己實現的與其相差無幾,本函式與linux中的實現最大的不同是不需要用專門的pclose 函式來關閉檔案指標,用普通的fclose 即可,linux實現的 也會給出在下文,可以對比一下其中差異。主要通過pipe管道...

使用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...