免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2585 | 回复: 6
打印 上一主题 下一主题

[C] [求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-18 15:03 |只看该作者 |倒序浏览
  本人现在有一个程序(C语言)用system函数运行“ftp -n”把一些文件送到某台机器,上次因目标机器空间不足,只传了两个文件就卡在那里近两个小时不退出!不知道是何原因?是否可以通过什么设置让其出错时退出?

  这个问题不知道是属于ftp范畴还是C语言范畴,所以在这里也发一份,不知是否合适~
  

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-03-18 15:13 |只看该作者

[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?

用popen和pclose代替system。

论坛徽章:
0
3 [报告]
发表于 2005-03-18 15:22 |只看该作者

[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?

由于以前没有用过popen和pclose这两个函数,现在需要先了解一下,先谢了!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-03-18 15:28 |只看该作者

[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?

man一下好了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-03-18 15:29 |只看该作者

[求助] 在程序(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)

论坛徽章:
0
6 [报告]
发表于 2005-03-18 15:39 |只看该作者

[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?

我刚才去搜索到一份“fork、exec系列与system、popen区别”,
看了一下最后好像没有讨论到第二个问题“2、system和popen有什么区别?都常用在什么场合?”

回到这里能看到这份翻译非常感谢!

论坛徽章:
0
7 [报告]
发表于 2005-04-29 09:26 |只看该作者

[求助] 在程序(C语言)用system函数运行“ftp -n”出错不返回?

在solaris下,ftp出错了的情况,pclose不能返回出错。利用popen/pclose不知道怎么才能检测到ftp命令不能成功执行的情况?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP