popen

       #include <stdio.h>

       FILE *popen(const char *command, const char *type);

       int pclose(FILE *stream);


函数说明

  popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这个管道必须由pclose()函数关闭,而不是fclose()函数。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。

  type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入。

  command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。

  popen()的返回值是个标准I/O流,必须由pclose来终止。前面提到这个流是单向的(只能用于读或写)。向这个流写内容相当于写入该命令的标准输入,命令的标准输出和调用popen()的进程相同;与之相反的,从流中读数据相当于读取命令的标准输出,命令的标准输入和调用popen()的进程相同。

返回值

  如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL。


/**********************************
*将目录下.jpg文件打印到屏幕上为.png
***********************************/
#include <stdio.h>
#include <string.h>

char buf[1024];
int main(void)
{
	FILE *pp = popen("ls", "r");

	while(fgets(buf, 1024, pp)){
		char *s;
		if( (s = strstr(buf, ".jpg")) ){
			*s = '\0';			//取出指针s的内容即:. 
			printf("%s.png\n", buf);
		}
	}
	pclose(pp);
	return 0;


}

/*$ ./a.out 
1.png
2.png
a.png
$ ls
1.jpg  2.jpg  a.jpg  a.out  popen_mv.c  pop_name2.c
*/<pre name="code" class="cpp">












/**********************************
*将目录下.jpg文件修改为.png
***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char buf[1024];
int main(void)
{
	FILE *pp = popen("ls", "r");

	while(fgets(buf, 1024, pp)){
		char *s;

		if( (s = strstr(buf, ".jpg")) ){
			char str_mv[1024] = "mv ";
			if(buf[strlen(buf) - 1] == '\n'){
				buf[strlen(buf) - 1] = '\0';
			}
			strcat(str_mv, buf);	//mv 1.jpg无空格 (以文件1.jpg为例)
			strcat(str_mv, " ");    //mv 1.jpg空格
			
			*s = '\0';		//取出指针s的内容即:. 
			strcat(buf, ".png");    //buf里为1.png
			strcat(str_mv, buf);	//mv 1.jpg 1.png
			printf("%s\n", str_mv);
			system(str_mv);
		}
	}
	pclose(pp);
	return 0;


}


/*$ ls
1.jpg  2.jpg  a.jpg  a.out
$ ./a.out 
mv 1.jpg 1.png
mv 2.jpg 2.png
mv a.jpg a.png
*/

 
 

你可能感兴趣的:(popen)