proc_lib分析

参考: http://www.cnblogs.com/me-sa/archive/2011/11/22/erlang0017.html

介绍:

在这里插入图片描述
从官方文档介绍可知, proc_lib模块用于启动符合OTP原则的进程, OTP的behavior都是使用proc_lib实现创建新进程,所以说这个模块是OTP的基石.

谈谈proc_lib:spawn与erlang:spawn的区别.

在这里插入图片描述
在这里插入图片描述
从源码可见, proc_lib:spawn最终也是调用erlang:spawn启动进程, 区别是proc_lib:spawn
初始化参数会多出祖先和父进程名字, 并存入进程字典, 最后使用MFA启动进程.

2.进程退出时的不同处理
普通Erlang进程只有退出原因是normal的时候才会被认为是正常退出,使用proc_lib启动的进程退出原因是shutdown或者{shutdown,Term}的时候也被认为是正常退出.因为应用程序(监控树)停止而导致的进程终止,进程退出的原因会标记为shutdown.使用proc_lib创建的进程退出的原因不是normal也不是shutdown的时候,就会创建一个进程崩溃报告,这个会写入默认的SASL的事件handler,错误报告会在只有在启动了SASL的时候才能看到.

  1. proc_lib:start_link.
    在这里插入图片描述
make -C /lib/modules/5.4.0-26-generic/build M=/home/zjc/C/modTest modules make[1]: Entering directory '/usr/src/linux-headers-5.4.0-26-generic' CC [M] /home/zjc/C/modTest/pingStats.o /home/zjc/C/modTest/pingStats.c: In function ‘ping_stat_hook’: /home/zjc/C/modTest/pingStats.c:41:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 41 | struct ethhdr *eth_header = NULL; | ^~~~~~ /home/zjc/C/modTest/pingStats.c:75:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 75 | u64 now = get_jiffies_64() * 1000 / HZ; | ^~~ /home/zjc/C/modTest/pingStats.c: In function ‘ping_stat_proc_show’: /home/zjc/C/modTest/pingStats.c:115:5: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode 115 | for (int i = 0; i < ping_data.seq; i++) | ^~~ /home/zjc/C/modTest/pingStats.c:115:5: note: use option ‘-std=c99’, ‘-std=gnu99’, ‘-std=c11’ or ‘-std=gnu11’ to compile your code /home/zjc/C/modTest/pingStats.c:118:29: warning: format ‘%zu’ expects argument of type ‘size_t’, but argument 3 has type ‘int’ [-Wformat=] 118 | seq_printf(m, "%-10zu %-20llu %-16s\n", i + 1, ping_data.stats[i].timestamp, ip_str); | ~~~~~^ ~~~~~ | | | | long unsigned int int | %-10u /home/zjc/C/modTest/pingStats.c: At top level: /home/zjc/C/modTest/pingStats.c:130:21: error: variable ‘ping_stat_proc_ops’ has initializer but incomplete type 130 | static const struct proc_ops ping_stat_proc_ops = { | ^~~~~~~~ /home/zjc/C/modTest/pingStats.c:131:6: error: ‘const struct proc_ops’ has no member named ‘proc_open’ 131 | .proc_open = ping_stat_proc_open, | ^~~~~~~~~ /home/zjc/C/modTest/pingStats.c:131:18: warning: excess elements in struct initializer 131 | .proc_open = ping_stat_proc_open, | ^~~~~~~~~~~~~~~~~~~ /home/zjc/C/modTest/pingStats.c:131:18: note: (near initialization for ‘ping_stat_proc_ops’) /home/zjc/C/modTest/pingStats.c:132:6: error: ‘const struct proc_ops’ has no member named ‘proc_read’ 132 | .proc_read = seq_read, | ^~~~~~~~~ /home/zjc/C/modTest/pingStats.c:132:18: warning: excess elements in struct initializer 132 | .proc_read = seq_read, | ^~~~~~~~ /home/zjc/C/modTest/pingStats.c:132:18: note: (near initialization for ‘ping_stat_proc_ops’) /home/zjc/C/modTest/pingStats.c:133:6: error: ‘const struct proc_ops’ has no member named ‘proc_lseek’ 133 | .proc_lseek = seq_lseek, | ^~~~~~~~~~ /home/zjc/C/modTest/pingStats.c:133:19: warning: excess elements in struct initializer 133 | .proc_lseek = seq_lseek, | ^~~~~~~~~ /home/zjc/C/modTest/pingStats.c:133:19: note: (near initialization for ‘ping_stat_proc_ops’) /home/zjc/C/modTest/pingStats.c:134:6: error: ‘const struct proc_ops’ has no member named ‘proc_release’ 134 | .proc_release = single_release, | ^~~~~~~~~~~~ /home/zjc/C/modTest/pingStats.c:134:21: warning: excess elements in struct initializer 134 | .proc_release = single_release, | ^~~~~~~~~~~~~~ /home/zjc/C/modTest/pingStats.c:134:21: note: (near initialization for ‘ping_stat_proc_ops’) /home/zjc/C/modTest/pingStats.c: In function ‘ping_stat_init’: /home/zjc/C/modTest/pingStats.c:163:43: error: passing argument 4 of ‘proc_create’ from incompatible pointer type [-Werror=incompatible-pointer-types] 163 | proc_create("ping_stat", 0, NULL, &ping_stat_proc_ops); | ^~~~~~~~~~~~~~~~~~~ | | | const struct proc_ops * In file included from /home/zjc/C/modTest/pingStats.c:8: ./include/linux/proc_fs.h:49:24: note: expected ‘const struct file_operations *’ but argument is of type ‘const struct proc_ops *’ 49 | struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops); | ^~~~~~~~~~~ /home/zjc/C/modTest/pingStats.c: At top level: /home/zjc/C/modTest/pingStats.c:130:30: error: storage size of ‘ping_stat_proc_ops’ isn’t known 130 | static const struct proc_ops ping_stat_proc_ops = { | ^~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:275: /home/zjc/C/modTest/pingStats.o] Error 1 make[1]: *** [Makefile:1719: /home/zjc/C/modTest] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-26-generic' make: *** [Makefile:3: all] Error 2
07-31
TARGET := mpp FW_SRC := mpp_proc.c FW_SRC += vb_proc.c log_proc.c sys_proc.c mpp_proc_common.c \ vi_proc.c vpss_proc.c venc_proc.c vdec_proc.c \ ai_proc.c ao_proc.c aenc_proc.c adec_proc.c \ vgs_proc.c cpm_proc.c region_proc.c media_mm_proc.c ifeq ($(ENABLE_MPP_TRACE),1) FW_SRC += trace_proc.c endif ifneq ($(findstring $(TARGET_CHIPSERIES), TX5335AX TX5368AX TX5339AX),) # $(info ----- proc TARGET_CHIPSERIES 52) # ccflags-y += -DCVE_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD FW_SRC += cve_proc.c FW_SRC += dma_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5336EX TX5256EX),) # $(info ------ proc TARGET_CHIPSERIES 53) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DCVE_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD # ccflags-y += -DBIS_PROC_BUILD ccflags-y += -DDX5336 -DVO_PROC_BUILD -DGDC_PROC_BUILD FW_SRC += cve_proc.c FW_SRC += bis_proc.c FW_SRC += gdc_proc.c FW_SRC += dma_proc.c FW_SRC += vo_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5215BX ),) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DCVE_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD ccflags-y += -DDX5215 -DVO_PROC_BUILD FW_SRC += cve_proc.c FW_SRC += dma_proc.c FW_SRC += vo_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5239BX TX5239CX),) # $(info ------ proc TARGET_CHIPSERIES 56) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DCVE_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD ccflags-y += -DTX5239 FW_SRC += cve_proc.c FW_SRC += dma_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5112DX),) # $(info ------ proc TARGET_CHIPSERIES 57) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD ccflags-y += -DDX5112 FW_SRC += cve_proc.c FW_SRC += dma_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5239DX),) # $(info ------ proc TARGET_CHIPSERIES 57) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD ccflags-y += -DTX5239 FW_SRC += cve_proc.c FW_SRC += dma_proc.c else ifneq ($(findstring $(TARGET_CHIPSERIES), TX5110FPGA TX5110FX),) # $(info ------ proc TARGET_CHIPSERIES 57B) # ccflags-y += -DAMR_PROC_BUILD # ccflags-y += -DDMA_PROC_BUILD ccflags-y += -DDX5110 FW_SRC += cve_proc.c FW_SRC += dma_proc.c endif FW_SRC_OBJ := $(FW_SRC:.c=.o) obj-m := $(TARGET).o $(TARGET)-y += $(FW_SRC_OBJ) ccflags-y += -fdebug-prefix-map=$(CURDIR)=. PWD := $(shell pwd) ccflags-y += -I$(PWD)/../libs/mpp/common/mpp_sys/inc \ -I$(PWD)/../libs/mpp/common/include/ \ -I$(PWD)/../libs/mpp/include/ \ -I$(PWD)/../libs/drv/audio/codec/ts_codec/ ccflags-y += -DUSE_MPP_HEADER -Wno-error=unused-variable ifeq ($(ENABLE_MPP_TRACE),1) ccflags-y += -DENABLE_MPP_TRACE endif modules: @echo "TARGET_CHIPSERIES:$(TARGET_CHIPSERIES)" @echo "ENABLE_MPP_TRACE:$(ENABLE_MPP_TRACE)" $(MAKE) -C $(TARGET_KERNEL_DIR) M=$(PWD) modules clear: @rm -f *.o *.cmd *.mod.c @rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f @rm -f .*ko.cmd .*.o.cmd .*.o.d @rm -f *.unsigned clean: @rm -f $(TARGET).ko @make -C $(TARGET_KERNEL_DIR) M=$(PWD) clean 同一套代码,该模块编译的ko在不同路径下为啥会不一样,以上是makefile脚本,
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值