user-0 提问: linux环境下daemon模式运行子进程与netlink通信失败

回复:
user: user-0
content: 引用 14 楼 northwesternwind 的回复:There are multiple known causes for this error:  - You attempted to set a route specific to an interface which was not up at the time you ran the command.  - You attempted to set a route for a network before setting a host route for the gateway which handles traffic for that network.  感谢帮忙出主意哈 在上面那个回复里 The most common cause for the message I've seen is that you're trying to route via a path that is not known to the host. For example, LAN is 192.168.56.100 and WAN is 10.0.3.15. ip route add 8.8.8.8/32 via 192.168.6.1 results in RTNETLINK answers: No such process because 192.168.6.1 is not known to the host.  路由 not known to the host可能是指这个gateway地址无法匹配到本地直连网段。但是我这里是通过dhcpc获取ip，肯定是直连路由的，并且删除的是默认路由0.0.0.0/0   同时因为shell下kill没有问题，从log看也是先删除路由失败再由系统通知地址删除的 应该不是这个原因  然后引用的这两个都是在set route的时候吧  我是del不掉route TAT

user: user-1
content: There are multiple known causes for this error:  - You attempted to set a route specific to an interface which was not up at the time you ran the command.  - You attempted to set a route for a network before setting a host route for the gateway which handles traffic for that network.

user: user-1
content: 看看这段话有没有帮助：  The most common cause for the message I've seen is that you're trying to route via a path that is not known to the host. For example, LAN is 192.168.56.100 and WAN is 10.0.3.15. ip route add 8.8.8.8/32 via 192.168.6.1 results in RTNETLINK answers: No such process because 192.168.6.1 is not known to the host.   来自 https://serverfault.com/questions/437598/what-can-cause-rtnetlink-answers-no-such-process-when-adding-a-route

user: user-0
content: 引用 11 楼 northwesternwind 的回复:调用kill()啊。 试过了 结果也一样……

user: user-1
content: 调用kill()啊。

user: user-0
content: 引用 9 楼 northwesternwind 的回复:引用 8 楼 seraph17 的回复:[quote=引用 4 楼 northwesternwind 的回复:] 严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？而且传递给system的是个字符串吧……这个我确实没打印出来过。你说的确实有可能，不过它就是个kill -s SIGTERM pid  错误可能性实在是不大…… 程序中使用system调用kill, 和你在shell中执行，差别挺多的。比如环境变量，工作目录，启动的哪个 shell等等，外部因素很多。基本上不到实在没办法，别用system(). 我个人看到system()就会本能的怀疑一切。。。。。。[/quote] 那么有没有其他比较可靠的方法？

user: user-0
content: 引用 4 楼 northwesternwind 的回复:严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？而且传递给system的是个字符串吧……这个我确实没打印出来过。你说的确实有可能，不过它就是个kill -s SIGTERM pid  错误可能性实在是不大……

user: user-0
content: 引用 4 楼 northwesternwind 的回复:严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？ 因为dhcpc这个功能比较小没有做平台化的常驻开发，类似这种应用我们统一了一个调用方法去处理pid和debug等。system是统一的方法。单独用kill我去试试看

user: user-0
content: 引用 5 楼 user-2 的回复:1. 在服务控制进程中执行命令前打印出Pid值。 2. 确认下那个命令是否就是在fork之后的子进程空间执行的。 3. 自己在dhcpcd中增加信号处理函数，进行debug。  pid打出来了 存在文件里 没有错 第二个没看太明白哈 第三个 信号处理是有的，debug也都打了。netlink发送失败就是dhcpcd的退出处理过程中打出来的

user: user-2
content: 1. 在服务控制进程中执行命令前打印出Pid值。 2. 确认下那个命令是否就是在fork之后的子进程空间执行的。 3. 自己在dhcpcd中增加信号处理函数，进行debug。

user: user-1
content: 引用 8 楼 seraph17 的回复:引用 4 楼 northwesternwind 的回复:严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？而且传递给system的是个字符串吧……这个我确实没打印出来过。你说的确实有可能，不过它就是个kill -s SIGTERM pid  错误可能性实在是不大…… 程序中使用system调用kill, 和你在shell中执行，差别挺多的。比如环境变量，工作目录，启动的哪个 shell等等，外部因素很多。基本上不到实在没办法，别用system(). 我个人看到system()就会本能的怀疑一切。。。。。。

user: user-1
content: 看的云里雾里，你kill的是哪个？如果是Kill的子进程，可能是因为你没有做好信号处理。另外，子进程需要和终端脱离关系。

user: user-1
content: 严重怀疑你传递给system的参数有问题。  为啥要用system()来这样干呢？l嵌入式linux没有kill()系统调用？

user: user-0
content: 主贴描述有一些逻辑不清，是我叙述问题   情况是这样的，嵌入环境下有一个服务控制进程，启动dhcpcd，daemon运行。dhcpcd在获取ip等业务完成后会自动fork。控制进程会保存dhcpcd的pid  这个时候控制进程kill -s SIGTERM  (pid)，dhcpcd可以正常退出，但无法发送netlink  routedel消息，返回错误no such process  同时，无论是控制进程启动dhcpcd，还是在shell里启动dhcpcd，通过shell杀掉dhcpcd，routedel消息都能正常发出去  反向验证，控制进程启动dhcpcd后，用一个c小程序调用system(kill -s SIGTERM  (pid))，同样能够正常发送routedel消息………………  然后我就没招了

user: user-0
content: 引用 1 楼 northwesternwind 的回复:看的云里雾里，你kill的是哪个？如果是Kill的子进程，可能是因为你没有做好信号处理。另外，子进程需要和终端脱离关系。  kill dhcpcd，kill的很简单所以没有贴 我的错  kill -s SIGTERM  (pid)   kill执行本身是没问题的，能够正常关闭。 dhcpcd在退出后会执行地址release流程，该流程包括了删除本地地址和路由，并通知netlink事件的处理。  然而问题在于，使用shell来kill，netlink的事件通知是可以正常送达的  使用该环境的一个服务管理进程去kill，最终是执行的system（kill -s SIGTERM  (pid)），则无法发送netlink事件。错误原因是no such process