linux 下面 如何等待一个命令的返回

huzhangyou 2007-01-31 07:28:16
下面是我的代码

#include <iostream>
#include <string>
#include <sys/time.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;

void do_event(int sig){

FILE *f_read;
f_read = popen("ping -c 2 221.8.9.2","r");
if(f_read == NULL){
exit(0);
}
char buf[1024];
while(fgets(buf,sizeof(buf),f_read)){
cout << string(buf) << endl;
}
pclose(f_read);

//cout << "Recv \n" << endl;
}
int main(int argc,char* argv[]){
struct itimerval value;
if(signal(SIGALRM,do_event) == SIG_ERR)
perror("signal");
while(1){
value.it_value.tv_sec = 10;
value.it_value.tv_usec = 0;
if(setitimer(ITIMER_REAL,&value,NULL)< 0){
perror("setitimer!");
}
sleep(10);
}
return 0;
}


我的想法是 每隔 10S执行一次 do_event

当ping -c 2 127.0.0.1的时候
程序没有任何问题

当ping -c 2 221.8.9.2的时候
因为这个IP是一个假的,ping肯定不通

这个时候 程序根本就不输出任何东西
正常应该会输出 没有ping通的信息的

如下面的代码:

#include <iostream>

using namespace std;
#include <stdio.h>

int main(int argc,char *argv[]){
FILE *f_read;
char buf[1024];
f_read = popen("ping -c 3 221.8.9.2","r");
if(f_read == NULL){
return 1;
}
while(fgets(buf,sizeof(buf),f_read)){
cout << string(buf) << endl;
}
pclose(f_read);
return 0;
}

会输出一些ping不通的信息

但是为什么 我使用signal就无法通呢?

期待大家帮忙看一下
十分感谢!
...全文
841 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzhangyou 2007-02-03
  • 打赏
  • 举报
回复
to xxyyboy(壮志凌云)(★★★★★) :

system("ping 127.128.128.124 > ping.result");


你想的简单了
如果你作出来
可以贴一下结果
我测试没有通过!

继续UP
iambic 2007-02-02
  • 打赏
  • 举报
回复
mark
KenYuan2016 2007-02-02
  • 打赏
  • 举报
回复
crontab 想起来了 crontab

crontab -l 查看
crontab -e 编辑

需要重新启动,好像是,我忘了,你baidu一下,crontab的应该很多。
KenYuan2016 2007-02-02
  • 打赏
  • 举报
回复
linux中 可以不要定时器, 你使用系统提供的。。。来做你的event事件

那个叫什么,我一下子想不起来名字。。。
KenYuan2016 2007-02-02
  • 打赏
  • 举报
回复
你可以使用
system();函数来执行
system("ping 127.128.128.124 > ping.result");

然后分析 ping.result中的结果和时间。

这个把问题简单话了,不过也是一种方法,不用信号量。
wingfiring 2007-02-01
  • 打赏
  • 举报
回复
貌似信号处理器中有很多的限制,建议把do_ping拿出来,不要放在信号处理器中。而且,楼主的代码不是信号安全的,如果ping的时间超过10s会怎样?
信号处理函数最好快速返回。
废人的步骤应该是比较合适的。
huzhangyou 2007-02-01
  • 打赏
  • 举报
回复
谢谢 我也试试你的说法
sinall 2007-02-01
  • 打赏
  • 举报
回复
楼主单步调试了吗?
我在Solaris下:
v2402% a.out
setitimer!: Invalid argument
setitimer!: Invalid argument

cygwin下:(ping 192.168.10.177)
$ ./a.exe


Pinging 192.168.10.177 with 32 bytes of data:



Request timed out.

Request timed out.

Request timed out.

Request timed out.



Ping statistics for 192.168.10.177:

Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
huzhangyou 2007-02-01
  • 打赏
  • 举报
回复
十分感谢 Wolf0403(废人); assert (!my["business"])

我测试一下结果


sinall(): 我没有那个系统 所以我测试不料

我在 Linux AS 4 测试不了啊
Wolf0403 2007-02-01
  • 打赏
  • 举报
回复
设置定时器、SIGALRM -> SIG_DFL
while ( 1 ) {
do_ping();
pause();
}
jixingzhong 2007-02-01
  • 打赏
  • 举报
回复
恩, 没遇到这个问题,
关注一个 ~
会飞的小洋洋 2007-02-01
  • 打赏
  • 举报
回复
up
cubety 2007-02-01
  • 打赏
  • 举报
回复
uup
OOPhaisky 2007-02-01
  • 打赏
  • 举报
回复
嗯,这个问题有点儿意思...
iambic 2007-01-31
  • 打赏
  • 举报
回复
没仔细看代码,不好意思……明天有时间试下吧。其实可以不用信号的吧?直接ping一次,然后sleep十秒钟不行吗?
huzhangyou 2007-01-31
  • 打赏
  • 举报
回复
to beforefly:
输出到了文件
但是程序就是不返回啊!!!!!!!!!!!!!

我使用 ps -A查看
发现ping死哪里了
僵死的进程了!!!
大家有没有什么方法!!!

继续关注!!!
beforefly 2007-01-31
  • 打赏
  • 举报
回复
system("ping -c 2 221.8.9.2 >1.txt");
看看 有没有输出到文件
huzhangyou 2007-01-31
  • 打赏
  • 举报
回复
还有我看到一篇文章说

system = exec+fork+waitpid

可是我使用system("ping -c 2 221.8.9.2");
程序依然没有任何输出!!!

大家继续

很急的一个问题啊!
huzhangyou 2007-01-31
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫·星辰) 都四个星星了!
汗一个!!!

继续请教!!!

to iambic:

我觉得 jixingzhong(瞌睡虫·星辰)说的对啊
第二个为什么正常呢!!!
jixingzhong 2007-01-31
  • 打赏
  • 举报
回复
没遇到过 ~~

不过,
如果是输出到 stderr,
那么下面的程序应该和上面的 signal 方式有一样的问题才对 ~~

现在下面的程序一切正常,
那么, signal 设置有问题?
加载更多回复(4)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧