子进程

Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程

心已入冬 提交于 2020-02-29 14:01:39
Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程 问题引入 :当你想循环使用exec调用另外一个程序时,发现只调用了一次就结束了。这是因为, exec函数通过运行新程序来替换当前程序 ,因此,后面的代码都没有运行。 为了达到我们想要的效果,在此引入 fork() 系统调用。 实例:RSS订阅功能 int main(int argc, char *argv[]) { char *feeds[] = {"http://www.cnn.com/rss/celebs.xml", "http://www.rollingstone.com/rock.xml", "http://eonline.com/gossip.xml"}; int times = 3; int i; char *phrase = argv[1]; for (i = 0; i < times; i++) { char var[255] = {}; sprintf(var, "RSS_FEED=%s", feeds[i]); char *vars[] = {var, NULL}; if (execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", phrase, NULL, vars) == -1) { fprintf

关于调用外部命令时与外部命令的数据交互的注意点

半世苍凉 提交于 2019-12-07 10:46:27
前两天,我打算下载点图片。用fiddler分析了下,结果那个网页大量使用js来操作cookie,弄得我头大。 go倒是有V8引擎的封装包,可是必须还得编译这个引擎,挺麻烦的。 想起来还有selenium-python可以用。就决定这个了。因为selenium没有python3.4的版本,不得不重装了python2.7。 多说一句,python3确实比python2的组织等各个方面改进很多,写起来感觉更好。可惜第三方库稀少是硬伤。 当时我的思路是这样的,用python和selenium来操作浏览器,提取网页图片地址和标题,传递给go,由go下载。 之所以由go下载,是因为python2的urllib等网络库有问题,经常会下载资源失败却不返回错误。相比之下,go的net库可以保证只要错误值是nil,下载必然完整。 我写了个python脚本,该python脚本会从标准输入接受一个网址,然后返回标题,之后,会依次访问每个漫画页面并返回图片网址。最后会输出一个结束标志。下载完毕后,可以再次接受网址进行下一次下载。 可以用go的exec.Command启动python脚本,然后用*Cmd类型返回值的StdinPipe()、StdoutPipe()方法的返回值来实现与子进程的交互,使用Start()方法启动命令就行了。 其实是个很简单的程序,算上go程,log,加锁