- 论坛徽章:
- 1
|
[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?
这是我以前翻译的:
POPEN(3) Linux Programmer's Manual POPEN(3)
名称:
popen, pclose - 进程 I/O。
大纲:
#include <stdio.h>;
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
描述:
popen()函数用创建管道的方式启动一个进程,并调用shell。因为管道是被定义成单向的,所以type参数只能定义成只读或者只写,不能是两者同时;结果流也相应的是只读或者只写。
command参数是一个字符串指针,指向的是一个以null结束符结尾的字符串,这个字符串包含一个shell命令。这个命令被送到/bin/sh以-c参数执行;即由shell来执行。 mode参数也是一个指向以null结束符结尾的字符串的指针,这个字符串必须是'r'或者'w’来指明是读还是写。(注:没找到这个mode参数啊。)
popen()函数的返回值是一个普通的标准I/O流,(),它只能用pclose函数来关闭,而不是fclose函数。向这个流的写入被转化为对command命令的标准输入;而command命令的标准输出则是和调用popen()函数的进程相同,除非这个被command命令自己改变。相反的,读取一个“被popen了的”流,就相当于读取command命令的标准输出,而command的标准输入则是和调用popen()函数的进程相同。
注意,popen()函数的输出流默认是被全缓冲的。
pclose()函数等待相关的进程结束并返回一个command命令的退出状态,就像wait4函数一样。
返回值:
如果fork(2)或者pipe(2)调用失败,或者它分配不到内存,popen()函数返回NULL。
如果wait4返回一个错误,或者其他什么错误发生,pclose()函数返回一个-1。
错误:
如果内存空间开辟失败,popen()函数并不设置errno。如果内部的fork()函数或者pipe()函数失败,errno则会被适当的设置。如果mode参数是不可用的,而且这个状态被侦测到,errno将被设置成EINVAL。(注:不懂。)
适应环境:
POSIX.2
BUGS:
因为command命令读取的标准输入和调用popen()函数的进程共享一个“搜索偏移量”,所以,如果原进程已经完成了一个缓冲的读取,那么command命令的输入位置将是不可预料的。相似的,command命令的输出会和原进程的输出混杂在一起。后者可以在调用popen()函数前调用fflush()函数来避免。
如果这个shell执行失败,将不能辨别出这个错误是由shell运行这个command命令失败,还是command命令立即退出引起的。唯一的一个“线索”,就是127这个退出状态。
历史:
popen()函数和pclose()函数(第一次)出现在Version 7 AT&T UNIX。
参考:
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3), fopen(3), stdio(3), system(3)。
BSD MANPAGE 1998-05-07 POPEN(3) |
|