文章目录
- 1.进程:fork(),ps -ef (同-aux) | more
- 2.信号:signal(, EXIT),jps
- 2.1 捕捉信号:ctrl+c:2
- 2.2 捕捉信号:kill -9:9
- 2.3 捕捉信号:kill:15
- 2.4 程序后台运行两种方法:&:ctrl+c无法中止,用killall book1或kill 进程号。if (fork()>0)return 0 父进程退出
- 3.dbus:IPC,libdbus(进程可以通过libdbus提供的函数来接入到D-Bus,如会提供注册方法、调用方法、发布信号等函数)
1.进程:fork(),ps -ef (同-aux) | more
一个进程(正在内存中运行的程序)在内存里有三部分数据:代码段(相同),堆栈段+数据段(不同)
。getpid库函数功能是获取进程编号,该函数没有参数,返回值是进程的编号(相同程序在不同时间执行,进程编号不同)。
进程应用:并发:把socket服务端改为多进程,每次accept到一个客户端连接后,生成一个子进程,让子进程负责与这个客户端通讯。父进程继续accept客户端连接
。以下在服务端中,在CTcpServer类中增加两个成员函数。
僵尸进程
:一个进程执行了exit系统调用退出时会向父进程发送SIGCHLD信号,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态,如进程ID、终止状态等等)的进程,ps显示有< default >。总结:仔细处理子进程死后的信息,如果不想处理就需要交给系统处理。
2.信号:signal(, EXIT),jps
进程间通信方式:1.管道
:ls | grep 1。
2.消息队列
:内核创建的一个消息队列,os中多个进程都能操作这个消息队列,可以往里面发送消息,可以接收消息。类似socket。
3.共享内存
:每个进程访问内存时,有一个虚拟内存地址和物理内存地址的一个映射,一般两个进程的虚拟内存地址可以一样,但映射的物理内存地址
一般不一样。共享内存
就是将它们映射的物理内存地址也变一样,这时两个进程能同时访问一块相同的物理内存,于是借助这块物理内存实现通信。
4.套接字
:常见,访问数据库进程和数据库进程本身,这两个进程间通信就是通过3306号端口建立起的tcp套接字。本机访问mysql不走tcp的套接字,而是走linux底层套接字。
5.信号量/灯
:类似一个计数器,控制多个进程对一个共享资源的访问,起到控制数量的锁机制。
6.信号
:一个进程可向另一个进程发送一个信号,进程可处理这个信号。如下列出所有信号,linux中信号大多数是把另一个进程杀死,干脆把这个指令叫kill了,如下64种死法。 如下是键盘中断ctrl+c,是当前shell向tail -f这个进程发送一个信号值为2的2)SIGINT
的信号。
2.1 捕捉信号:ctrl+c:2
如下在死循环之前注册下信号的处理,如下让ctrl+c无效。
点击Build后就会将类编译出来。
如上ctrl+c无法停止,只能用kill,jps查看进程pid。
2.2 捕捉信号:kill -9:9
2.3 捕捉信号:kill:15
将如上KILL换成TERM即SIGTERM,重新build project。win下信号比linux下信号少很多,将当前程序打包成jar包传到linux。用如下命令行打包。
如下用压缩软件打开1.jar。
如下:后有一个空格,最后一行是空行。
2.4 程序后台运行两种方法:&:ctrl+c无法中止,用killall book1或kill 进程号。if (fork()>0)return 0 父进程退出
信号作用:服务程序在后台运行,如果想终止它,杀了它不是个好办法,因为没有释放资源。如果能向程序发一个信号,程序收到这个信号后调用一个函数,在函数中编写释放资源代码,程序就可以安全体面退出。
下面 EXIT函数就是自定义函数,TcpServer设为全局变量因为EXIT函数要访问它并关闭socket。
3.dbus:IPC,libdbus(进程可以通过libdbus提供的函数来接入到D-Bus,如会提供注册方法、调用方法、发布信号等函数)
1.
列举所有service的对象结构:busctl tree(首先列举的是service名字,然后再遍历列举该service下所有对象的名字)。
2.
列举指定service的对象结构:busctl tree service(不含.service,busctl中的NAME或UNIT)。
3.
列举总线上所有的连接:busctl list。
NAME PID PROCESS USER CONNECTION UNIT SESSION DESCRIPTION
:1.10 690 wpa_supplicant root :1.10 wpa_supplicant.service
4.
获取server的状态信息:busctl status service。
5.
获取对象/接口的属性信息:busctl introspect service 对象 [接口] (中括号可写可不写,服对接)。SIGNATURE :签名,参数。
# busctl introspect xyz.openbmc_project.Time.Manager(服) /xyz/openbmc_project/time/bmc(对) xyz.openbmc_project.Time.EpochTime(接)
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Elapsed property t 4827706922 emits-change writable
6.
调用接口的方法:busctl call service 对象 接口 方法 参数类型 参数(如下三个参数)
。
# busctl call xyz.openbmc_project.Time.Manager(服) /xyz/openbmc_project/time/bmc(对) org.freedesktop.DBus.Properties(接) Set(方法) ssv xyz.openbmc_project.Time.EpochTime Elapsed 167601266
如下as字符串数组放一个字符串。
7.
获取接口所有属性值
:D-Bus的对象都含有一个接口org.freedesktop.DBus.Properties,可以通过其方法GetAll获取某个接口的所有属性值:busctl call service 对象 org.freedesktop.DBus.Properties GetAll s 接口。
# busctl call org.freedesktop.login1(服) /org/freedesktop/login1/user/_1000(对) org.freedesktop.DBus.Properties(接) GetAll s org.freedesktop.login1.User(接)
# 可列举用户的属性信息,接口名前的s是GetAll的输入参数类型,代表一个string,可以为该命令加上选项--json=pretty,这样可以输出内容为JSON易读格式
8.
获取接口某个属性值
:D-Bus的对象都含有一个接口org.freedesktop.DBus.Properties,可以通过其方法Gel获取某个接口的某个属性值:busctl call service 对象 org.freedesktop.DBus.Properties Get ss 接口 属性。
# busctl call org.freedesktop.login1(服) /org/freedesktop/login1/user/_1000(对) org.freedesktop.DBus.Properties(接) Get ss org.freedesktop.login1.User(接) Slice(属)
v s "user-1000.slice"
# Get后面的ss代表是两个string类型的参数
9.
获取属性值:busctl get-property service 对象 接口 属性。
# busctl get-property xyz.openbmc_project.Time.Manager(服) /xyz/openbmc_project/time/bmc(对) xyz.openbmc_project.Time.EpochTime(接) Elapsed(属)
t 5194896326 (t值,b布尔型)
10.
设置属性值:busctl set-property service 对象 接口 属性 属性类型 属性值。
# sudo busctl set-property org.freedesktop.systemd1(服) /org/freedesktop/systemd1(对) org.freedesktop.systemd1.Manager(接) LogLevel(属) s(属性类型) debug(属性值)