系统命令在C程序中挂起,但是当我在bash上运行命令时它就成功了

时间:2010-07-27 08:21:03

标签: c linux

我需要发送一个IP的arp来获取它在不同机器上配置的mac地址。我正在通过“系统(arping -c 3 -i eth0)从C程序中取消这个ip,但我发现它在那里被绞死。

但是如果我从bash“arping -c 3 -i eth0”运行相同的命令,它就会成功执行。

在从bash运行命令成功完成时,我无法理解为什么系统命令在这种情况下被挂起。

谢谢,

3 个答案:

答案 0 :(得分:1)

既然你说它挂了就可以试试:

strace -o my_prog.strace -f ./my_prog

然后在挂起后将其杀死。然后你可以查看strace输出文件my_prog.strace并尝试弄清楚出了什么问题。

您可能需要查看strace手册页以查看您可能喜欢使用的其他选项 - 对我来说特别有用的是使它在缓冲区(和字符串)输入/输出中显示更多数据的选项。

如果它没有真正挂起,您应该检查致电system( )的返回值,然后检查errno

修改

如果arping实际上是setuid根程序的链接,sudo实际arping {{1}},那么我刚才想到的可能导致挂起的事情就会出现问题它正在等待输入密码,但该程序的终端设置不正确。

答案 1 :(得分:0)

尝试系统(“arping -c 3 -I eth0 ip-addr”); 类似的东西:

main()的 {    system(“arping -c 3 -I eth0 192.168.10.1”); }

答案 2 :(得分:0)

您是否正在使用任何子进程执行上述操作?

从system()的定义: system()函数应忽略SIGINT和SIGQUIT信号,并在等待命令终止时阻塞SIGCHLD信号。在子进程终止之前,system()函数不会返回。

建议:

1.检查system()&的返回值做出适当的决定。

例如:如果返回值为零,则表示命令处理器不可用。如果无法创建子进程,或者无法获取命令语言解释器的终止状态,则system()应返回-1并设置errno表示错误。

2.使用完整的shell命令执行。

例如:system("arping -c 3 -I eth0 10.203.198.10");