openwrt 之dhcp客戶端呼叫分析
客戶端程式
[email protected]:/proc/1679# ps -w | grep udh
1679 root 1484 S udhcpc -p /var/run/udhcpc-eth0.2.pid -s /lib/netifd/dhcp.script -f -t 0 -i eth0.2 -V 3830d84fd8bc77bf -C
其父程序為 netifd
[email protected]:/proc/1679# cat stat
1679 (udhcpc) S 1593 0 0 0 -1 4194560 167 1266 0 0 0 3 8 6 20 0 1 0 3924 1519616 110 2147483647 4194304 4613096 2146095136 2146093040 1997973920 0 0 4100 114688 2149225712 0 0 18 0 0 0 0 0 0 4678632 4679983 10878976 2146098997
2146099102 2146099102 2146099183 0
1593 root 1552 S /sbin/netifd
下面來看udhcpc這個程式是如何被執行的:
首先來看下面的dhcp.sh檔案
[email protected]:/lib/netifd/proto# ls
3g.sh dhcp.sh ppp.sh qmi.sh
找到下面的程式碼
proto_run_command "$config" udhcpc \ -p /var/run/udhcpc-$iface.pid \ -s /lib/netifd/dhcp.script \ -f -t 0 -i "$iface" \ ${ipaddr:+-r $ipaddr} \ ${hostname:+-H $hostname} \ ${vendorid:+-V $vendorid} \ $clientid $broadcast $dhcpopts
dhcp客戶端就是通過上面的指令碼呼叫執行的
proto_run_command函式在netifd-proto.sh中有定義
函式的最後一句是:
_proto_notify "$interface"
_proto_notify() {
local interface="$1"
local options="$2"
json_add_string "interface" "$interface"
ubus $options call network.interface notify_proto "$(json_dump)"
}
最終呼叫的是ubus命令,通知notify_proto。
接下來進入netifd的原始碼裡,在ubus.c檔案中
static struct ubus_method iface_object_methods[] = {
{ .name = "lds", .handler = netifd_handle_down },
{ .name = "up", .handler = netifd_handle_up },
{ .name = "down", .handler = netifd_handle_down },
{ .name = "status", .handler = netifd_handle_status },
{ .name = "prepare", .handler = netifd_handle_iface_prepare },
{ .name = "dump", .handler = netifd_handle_dump },
UBUS_METHOD("add_device", netifd_iface_handle_device, dev_link_policy ),
UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_link_policy ),
{ .name = "notify_proto", .handler = netifd_iface_notify_proto },
{ .name = "remove", .handler = netifd_iface_remove },
{ .name = "set_data", .handler = netifd_handle_set_data },
};
notify_proto進入的是netifd_iface_notify_proto函式,執行iface->proto->notify(iface->proto, msg);最終呼叫的是
proto_shell_notify函式->proto_shell_run_command->netifd_start_process->建立子程序並執行
還有個問題沒有解決是,最開始的dhcp.sh是如何被執行的?
該指令碼執行有兩個入口點,第一處在netifd初始化過程中
static void
netifd_parse_script_handler(const char *name, script_dump_cb cb)
{
struct json_tokener *tok = NULL;
json_object *obj;
static char buf[512];
char *start, *cmd;
FILE *f;
int len;
#define DUMP_SUFFIX " '' dump"
cmd = alloca(strlen(name) + 1 + sizeof(DUMP_SUFFIX));
sprintf(cmd, "%s" DUMP_SUFFIX, name);
f = popen(cmd, "r");
if (!f)
return;
...
其執行了dhcp.sh '' dump,通過popen執行並返回json結果第二處為proto_shell_handler->netifd_start_process->分配子程序執行
以上內容僅供參考
相關推薦
openwrt 之dhcp客戶端呼叫分析
客戶端程式 [email protected]:/proc/1679# ps -w | grep udh 1679 root 1484 S udhcpc -p /var/run/udhcpc-eth0.2.pid -s /lib/netifd/d
SpringCloud微服務搭建之fegin客戶端遠端服務呼叫
什麼是Feign Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。Feign預設集成了Ribbon,並和Eureka結合,預設實現了負
RabbitMQ客戶端原始碼分析之BlockingCell.md
RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 BlockingCell BlockingCell,程式碼文件註釋描述為”簡單的一次性IPC機制“,
RabbitMQ客戶端原始碼分析(三)之Command
RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 Command Command介面是AMQP方法-引數的容器介面,帶有可選的內容頭(content
RabbitMQ客戶端原始碼分析(五)之ConsumerWorkSerivce與WorkPool
RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 WorkPool WorkPool可以認
RabbitMQ客戶端原始碼分析(六)之IntAllocator
RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 IntAllocator 用於分配給定範
RabbitMQ客戶端原始碼分析(七)之Channel與ChannelManager
RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 Channel uml圖 tran
RabbitMQ客戶端原始碼分析(九)之RPC請求響應
宣告 Queue宣告、exchange宣告、bind等,這些都是通過同步RPC呼叫 channel.queueDeclare(queueName, durable
zookeeper原始碼分析之二客戶端啟動
ZooKeeper Client Library提供了豐富直觀的API供使用者程式使用,下面是一些常用的API: create(path, data, flags): 建立一個ZNode, path是其路徑,data是要儲存在該ZNode上的資料,flags常用的有: PERSISTEN, PERSIS
WebService學習之旅(六)使用Apache Axis2實現WebService客戶端呼叫
上節介紹瞭如何使用Axis2 釋出一個WebService,Axis2除了為我們編寫WebService應用帶來了便利,也同樣簡化的客戶端呼叫的過程,本節在上節的基礎上使用Axis2自帶的工具生成客戶端呼叫輔助類,並實現客戶端呼叫程式碼的編寫。 1.將前面下載
ArcGIS網路分析之Silverlight客戶端最近設施點分析(二)
在上一篇中說了如何實現最近路徑分析,本篇將討論如何實現最近設施點分析。 最近設施點分析實際上和路徑分析有些相識,實現的過程基本一致,不同的是引數的設定,選用的分析圖層為最近設施點網路分析圖層,一般形式為: http://<伺服器名或ip地址>/ArcGIS/re
axis2客戶端呼叫免費的webservice服務的例項之三axis2使用RPC方式呼叫網上免費WebService
前面兩節我們分別說了呼叫webservice的兩種方式: 下面我們介紹一下第三種方式:axis2使用RPC方式呼叫網上免費WebService 這種方式類似第二種方式,只是用到的類不同,但是這種方式感覺容易出問題。不多說,直接上程式碼 <span style=
Spring Cloud之Feign客戶端
電子商務 springcloud spring cloud springcloud微服務 微服務雲架構 Feign是一個聲明式的Web服務客戶端。這使得Web服務客戶端的寫入更加方便 要使用Feign創建一個界面並對其進行註釋。它具有可插入註釋支持,包括Feign註釋和JAX-RS註釋。F
流媒體協議之RTSP客戶端的實現20171014
叠代 jrtplib 訪問 pac .cpp 服務端 blog 文件 僅支持 RtspClient是基於jrtplib實現的,目前僅支持h264格式,後續將不斷叠代優化,加入對其他格式的支持,並且將實現RTSP的服務端。 RtspClient的功能是接收服務端過來流,然後寫
SCOM 2016 之 發現客戶端
scom2016 發現客戶端 operations manager 前面的三篇文章向大家詳細介紹了SCOM2016 的部署過程,今天就來和大家分享一下 SCOM 2016的一些基礎功能操作步驟,希望對大家有幫助。關於SCOM 2016的功能,我們的第一篇部署文章已經說了,其實SCOM就是一個管理和
虛擬機dhcp客戶端不能連接獲取ip
dhclinet linux dhcp 今天在一臺虛擬機上安裝了dhcp服務,但是另一臺機器始終不能獲取ip地址,配置也大致上沒錯,解決辦法如下:運行命令:dhclient ens33主動獲取ip地址即可。dhclient -r並沒有真正釋放IP,下一次執行dhclient eth1時,沒有dis
Steeltoe之Config客戶端篇
cloud 雲應用 com fig 可擴展 介紹 pps 模式 ons Steeltoe是一款開源項目,其目標是選取源自Netflix及其它公司的工具,使它們能夠運用於.NET社區。它不僅可以在.NET Core上,也可以在.NET Framework 4.X以上使用。此外
webservice服務端釋出和客戶端呼叫
1.服務端和客戶端增加Maven依賴包,如下 <!-- cxf方式webservice服務 --> <dependency> <group
憑什麼說AMQP比JMS優秀啊?JMS才是真正實現了一個客戶端呼叫多種產品的訊息中介軟體啊
一、AMQP 歷史 訊息佇列(Message Queue)起源於一位來自 MIT 的硬體設計教育工作者 Vivek Ranadivé 設想了一種通用軟體匯流排,就像主機板上的匯流排那樣,供其他應用程式接入。Vivek在1983年成立了 Teknekron,高盛等公司作為第一批使用者再金融交易中採用了 Tek
啟動Spring cloud eureka客戶端呼叫方 報錯start bean 'eurekaAutoServiceRegistration' NullPointerException
原文地址:https://blog.csdn.net/action_to_success/article/details/79744263 org.springframework.context.ApplicationContextException: Failed to start bean 'e