免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8794 | 回复: 8

[C] 使用popen执行命令行命令的问题 [复制链接]

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2014-12-31 15:47 |显示全部楼层
本人想使用popen函数 执行iptables的命令,但是却遇到一个十分不解的问题 ,完全找不到头绪。


我在一个线程当中准备执行两条iptables命令,  提示打印都没有问题。但是当程序运行起来,去iptables内查看发现 这两个命令根本没有被执行。为了测试写法是否正确,我在同一地方额外又加了其他的命令,比如:“uname -a”  命令。。然后发现  这个命令居然被正确执行了 ,但是那两个iptables命令却没被执行,程序没有发生任何的错误,实在是太奇怪了。。烦请各位大神指点一二,, 不胜感激!!!!!

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2014-12-31 15:51 |显示全部楼层
正确执行的命令跟那两条命令 有两个区别,  一是它有返回值,可以使用read读取ml执行后的返回值,而iptables的两条命令没有返回值。第二个就是命令的长度不一样,不过我觉得这个应该没有影响的吧。。。。。。。。

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2014-12-31 19:13 |显示全部楼层
或者我在线程中直接使用system函数来执行命令行,但是system函数虽然显示执行成功了,但是最后返回非0的状态值 ,然后执行的命令依旧无效。。。。。。

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2014-12-31 19:17 |显示全部楼层
int
getCom(char *mycomm)
{
  char *tokcom;
  char command[256];
  FILE *getcom;
  memset(command,0,256);
  tokcom = malloc(64);
  memset (tokcom, 0, 64);
  syslog(LOG_WARNING, "=====getCom begin====");
  sprintf(command,"%s", mycomm);
  syslog(LOG_WARNING, "=====comm : %s====", mycomm);
  syslog(LOG_WARNING, "=====command: %s====", command);
  if ((getcom = popen (command, "r")) == NULL)
    {
      pclose (getcom);
      free (tokcom);
          syslog(LOG_WARNING, "=====getcom 1====");
      return -1;
    }
  else
    {
      sleep(1);
      size_t len = read (fileno (getcom),tokcom,64);
          syslog(LOG_WARNING, "=====len : %d====", len);
          syslog(LOG_WARNING, "=====tokcom : %s====", tokcom);
          syslog(LOG_WARNING, "=====getcom 2====");

          pclose (getcom);
      free (tokcom);
          return 0;
    }

   
    return 0;
  syslog(LOG_WARNING, "=====getcom end====");
}  
popen的代码

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
发表于 2015-01-04 21:12 |显示全部楼层
你要执行的命令是什么?
在popen执行命令之后,试试再执行service iptables save

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2015-01-05 09:30 |显示全部楼层
回复 5# kaede_1
多谢回帖,我是要执行两句iptables命令,作用是使防火墙对某一ip放行。 可是无论我用popen也好,system也好,都无法执行这两句命令。或者说是执行了没有效果。  执行那些比如ls ,uname命令都可以。

   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
发表于 2015-01-05 09:41 |显示全部楼层
我通过打印system函数的返回值,正常执行的命令比如ls,它返回0值。但是iptables命令返回的就是非0整数。  iptables命令我手动在命令行输入都能有效,放到system函数里面就不行了。  这system函数我是放在一个线程上的

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
发表于 2015-01-05 15:07 |显示全部楼层
你可以通过WEXITSTATUS()宏获取错误代码,看看具体是什么错误。基本上system能干的活儿,popen都能完成,而且性能和使用上要优于system

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
发表于 2015-01-05 16:59 |显示全部楼层
C语言是否可以调用SHELL脚本,你干脆把iptables语句写成脚本,然后又C语言去调用好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP