调用system函数执行更改MAC地址异常退出,上面的设置命令直接在shell终端中或在单独的shell脚本中能正常执行

kgduwu 2012-07-30 11:44:54
int setmacaddr(unsigned char ipbyte)
{
char macaddr[50];
char ipaddr[30];
int retflag = 0;
memset(macaddr,0,50);
memset(ipaddr,0,30);
sprintf(macaddr,"/sbin/ifconfig eth0 hw ether 40:55:52:4d:43:%02x",g_NodeID + 100);
sprintf(ipaddr,"/sbin/ifconfig eth0 192.168.0.%d netmask 255.255.255.0",g_NodeID + 100);
if(system("/sbin/ifconfig eth0 down") != -1)
{
printf("1;");
if(system(macaddr) != -1)
{
printf("2;");
}
else
{
printf("3;");
lprintf(log,FATAL,macaddr);
retflag = 1;
}
if(system("ifconfig eth0 up") != -1)
{
printf("4;");
}
else
{
printf("5;");
lprintf(log,FATAL,"ifconfig eth0 up fail!\r\n");
retflag = 3;
}
}
else
{
printf("6;");
lprintf(log,FATAL,"ifconfig eth0 down fail!\r\n");
retflag = 4;
}
调用system函数执行更改MAC地址异常退出,上面的设置命令直接在shell终端中或在单独的shell脚本中能正常执行
当调用上述函数时,系统先通过printf("1;");打印出 1;然后系统自己打印出eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1,然后程序执行就退出了,没有进入我准备的失败判断分支,也没有进入我准备的执行正常分支,不知道从哪个分支退出的?
谁指出根本原因?
...全文
354 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
morris88 2012-07-30
  • 打赏
  • 举报
回复
为何不判断返回值 == 0 ?

if(system("/sbin/ifconfig eth0 down") == 0)
kgduwu 2012-07-30
  • 打赏
  • 举报
回复
在上面的printf函数中都添加了\r\n来使串口终端打印执行的各个分支标志来判断:
发现setmacaddr中的调用的函数都得到了执行并且每个system函数执行完后都返回0值,但是当我写的这个setmacaddr函数调用 return retflag标志返回到程序中的main函数时发现setmacaddr函数并没有返回到main函数中以至于setmacaddr函数后面的函数都没有被执行,于是我就将setmacaddr函数中的内容全部剪切到main函数,发现main函数倒是执行了设置MAC和IP后执行了其之后的所有的内容,但是之后出现
------------[ cut here ]------------
WARNING: at net/sched/sch_generic.c:226 dev_watchdog+0x154/0x240()
NETDEV WATCHDOG: eth0 (dm9000): transmit timed out
......

......
[<c0041db8>] (__do_softirq+0x0/0x104) from [<c00421a4>] (irq_exit+0x48/0x50)
[<c004215c>] (irq_exit+0x0/0x50) from [<c0027074>] (__exception_text_start+0x74/
0x90)
[<c0027000>] (__exception_text_start+0x0/0x90) from [<c0027a14>] (__irq_svc+0x34
/0x60)
Exception stack(0xc02f7f50 to 0xc02f7f98)
7f40: 00000000 0005317f 0005217f 60000013
7f60: c00293c0 c02f6000 c0023f04 c02f9d90 20022770 41069265 2002273c c02f7fa4
7f80: 600000d3 c02f7f98 c0029408 c0029414 60000013 ffffffff
r5:fefff000 r4:ffffffff
[<c00293c0>] (default_idle+0x0/0x5c) from [<c0029288>] (cpu_idle+0x50/0x80)
[<c0029238>] (cpu_idle+0x0/0x80) from [<c0257e94>] (rest_init+0x58/0x6c)
r5:c0313a8c r4:c031bd34
[<c0257e3c>] (rest_init+0x0/0x6c) from [<c0008a0c>] (start_kernel+0x284/0x2dc)
[<c0008788>] (start_kernel+0x0/0x2dc) from [<20008034>] (0x20008034)
r5:c0313fb8 r4:00053175
---[ end trace edbc9c98e4bd2fe1 ]---
Linux-Torvalds 2012-07-30
  • 打赏
  • 举报
回复
为什么不直接该配置文件/etc/sysconfig/network-script/ifcfg-eth0

然后执行/etc/init.d/network restart

system在执行的时候,确保命令正确,没有必要检查返回值吧?直接一堆system执行下来就可以了。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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