popen/pclose解析
(2011-06-11 21:30:04)popen()
度娘是这样解释的:
表头文件
#include
函数定义
FILE * popen ( const char * command , const char * type );
int pclose ( FILE * stream );
函数说明
popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果
type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。
command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。
popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen
{
FILE *fp;
fp=popen("ls","r");
printf("popen!\n");
sleep(3);
pclose(fp);
printf("pclose!\n");
sleep(3);
}
if ( (pid = fork()) == -1 ){
close(pfp[0]);
close(pfp[1]);
return NULL;
}
if ( pid > 0 ){
if (close( pfp[child_end] ) == -1 )
return NULL;
return fdopen( pfp[parent_end] , mode);
}
if ( close(pfp[parent_end]) == -1 )
exit(1);
if ( dup2(pfp[child_end], child_end) == -1 )
exit(1);
if ( close(pfp[child_end]) == -1 )
exit(1);
execl( "/bin/sh", "sh", "-c", command, NULL );
exit(1);
子进程则会调用execl函数执行shell命令,execl后面的exit(1)是在execl执行失败后才会执行,所以写的是exit(1),源码果真是写的精简却不简单那!!
pclose源码木有找到,囧。。。等找到再分析
找源码还必须翻墙。。。现在开始分析
The code sample below illustrates how the pclose() function might be implemented on a system conforming to IEEE Std 1003.1-2001.
int pclose(FILE *stream)
{
}