免费注册 查看新帖 |

Chinaunix

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

[C++] linux下可以使用C++调用外部shell脚本吗 [复制链接]

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-27 16:01 |只看该作者 |倒序浏览
情况是这样,程序A(客户端的作用)因为调用的一个中间件程序B有缺陷,每次通过B的一些API函数调用服务端不能断开连接(断开A即崩溃)。
然后每次调用不断开连接的话会出现,如果服务端出现异常,那客户端之后的所有调用都出错,只能重启客户端才能继续正常调用。

因为服务端异常时会返回一个错误码,然后客户端通过判断错误码来检验是否调用失败。

现在想在判断调用失败那分支中加一个调用shell脚本的功能,然后拿个shell脚本先结束客户端进程,然后重启客户端。

想问一下如何才能实现C++调用外部shell脚本,求大神指点下。谢谢

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2014-01-27 16:03 |只看该作者
简单的说,你就是要调用一个shell命令,这当然能实现了。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
3 [报告]
发表于 2014-01-27 16:06 |只看该作者
回复 2# fender0107401


    亲,就是不太了解实现方法才来求助哎,在linux下可以通过调用啥函数来实现呢

   我看网上有说用system函数什么的,可以用它在linux下调用脚本么。。。

论坛徽章:
0
4 [报告]
发表于 2014-01-27 16:12 |只看该作者
本帖最后由 myfifi_cu 于 2014-01-27 16:14 编辑

与平台无关,执行系统脚本或者命令的代码:
  1. // 执行系统命令,返回命令执行结果字符串
  2. string get_output_of_cmd(const string &cmd) {
  3.   int32_t count(2048);
  4.   char s[2048];
  5.   string ret;

  6.   FILE* stream = popen(cmd.c_str(), "r");

  7.   if (stream != NULL) {
  8.     // 每次从stream中读取指定大小的内容
  9.     while (fgets(s, count, stream))
  10.       ret += s;
  11.     pclose(stream);
  12.   }

  13.   return ret;
  14. }


  15. // 执行系统命令,根据命令退出代码返回布尔值
  16. bool get_exit_status_of_cmd(const string &cmd) {
  17.   return (system(cmd.c_str()) == 0);
  18. }


  19. 调用:

  20. get_output_of_cmd("ls /root");
  21. get_output_of_cmd("/data/test.sh");

  22. get_exit_status_of_cmd("ls /root");
  23. get_exit_status_of_cmd("/data/test.sh");
复制代码

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
5 [报告]
发表于 2014-01-27 16:18 |只看该作者
回复 4# myfifi_cu


    像调用systerm函数的话,我看网上有这么两条            
            在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说;
            在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。
   
   这样的话是不是我启动的那个脚本执行kill命令也杀不掉调用该脚本的这个程序了呢?

论坛徽章:
0
6 [报告]
发表于 2014-01-27 16:27 |只看该作者
你担心多了吧!
自己写代码测试一下不就知道了。

只要不是僵死进程,kill -9 可以强行杀掉。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
7 [报告]
发表于 2014-01-27 16:29 |只看该作者
回复 6# myfifi_cu


    好吧 还是搞一个试试看看成不成 谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP