popen

来源:互联网 发布:我想在淘宝上做代理商 编辑:程序博客网 时间:2024/04/30 11:08
       #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.png2.pnga.png$ ls1.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.pngstrcat(str_mv, buf);//mv 1.jpg 1.pngprintf("%s\n", str_mv);system(str_mv);}}pclose(pp);return 0;}/*$ ls1.jpg  2.jpg  a.jpg  a.out$ ./a.out mv 1.jpg 1.pngmv 2.jpg 2.pngmv a.jpg a.png*/



0 0