<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Hxysayhi</title>
    <link>https://hxysayhi.github.io/tags/linux/</link>
    <description>Recent content in Linux on Hxysayhi</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 30 Jun 2023 08:34:50 +0000</lastBuildDate>
    <atom:link href="https://hxysayhi.github.io/tags/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>如何临时或永久修改route table</title>
      <link>https://hxysayhi.github.io/posts/b9ec2c19/</link>
      <pubDate>Fri, 30 Jun 2023 08:34:50 +0000</pubDate>
      <guid>https://hxysayhi.github.io/posts/b9ec2c19/</guid>
      <description>&lt;h2 id=&#34;内容摘要&#34;&gt;内容摘要&lt;/h2&gt;&#xA;&lt;p&gt;如何修改route table，如何临时增加或删除路由条目，如何永久添加或删除路由条目。主要涉及route命令、nmcli命令、相关配置文件持久化位置等&lt;/p&gt;&#xA;&lt;h2 id=&#34;临时修改重启后丢失&#34;&gt;临时修改，重启后丢失&lt;/h2&gt;&#xA;&lt;p&gt;直接使用 route 命令可以进行临时修改，但是在系统重启或者是执行interface重启后会丢失。&lt;/p&gt;&#xA;&lt;p&gt;命令使用方式：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route {add | delete} {-host | -net} {des_ip} [netmask {net mask}] [gw {gw}] [dev {device}]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;route add：命令关键字，表示增加路由，若要删除路由，则为route del；&#xA;&#xA;-host | -net：表示路由目标是主机还是网段；&#xA;&#xA;netmask：表示路由目标为网段时才会使用到，表示路由目标网段的子网掩码；&#xA;&#xA;gw：命令关键字，后面跟下一跳网关；&#xA;&#xA;dev：命令关键字，后面跟具体设备名，表示路由是从该设备出去。&#xA;&#xA;metric：为路由指定所需跳数里的多个路由中选择与转发包中的目标地址最为匹配的路由。所选的路由具有最少的跳数。跳数能够反映途经节点的数量、路径的速度、路径可靠性、路径吞吐量以及管理属性。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;示例：&lt;/p&gt;&#xA;&lt;p&gt;添加路由：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route add –host 192.168.168.110 dev eth0&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route add –host 192.168.168.119 gw 192.168.168.1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route add -net 192.168.3.0/24 dev eth0&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route add -net 192.168.2.0/24 gw 192.168.2.254&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;route add –net 180.200.0.0 netmask 255.255.0.0 gw 10.200.6.201 dev eth0 metric 1&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>wait非子进程退出</title>
      <link>https://hxysayhi.github.io/posts/2c936b7c/</link>
      <pubDate>Sat, 12 Mar 2022 22:35:18 +0000</pubDate>
      <guid>https://hxysayhi.github.io/posts/2c936b7c/</guid>
      <description>&lt;h3 id=&#34;背景&#34;&gt;背景&lt;/h3&gt;&#xA;&lt;p&gt;有这样一个业务场景，需要主进程可以监测它创建的子进程是否还存活，通常来说使用 waitpid 来获取子进程的状态变化情况，就可以实现需求。但是我们希望在主进程异常退出重启后还能够监测之前创建的子进程的存活情况，但是waitpid 又只能针对子进程使用。于是就有了以下问题：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;为什么waitpid只能针对子进程使用？&lt;/li&gt;&#xA;&lt;li&gt;有没有什么方法可以改变子进程的父进程？&lt;/li&gt;&#xA;&lt;li&gt;有没有什么方式可以监测非子进程的退出，或者是其他状态变化？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;为什么waitpid只能针对子进程使用&#34;&gt;为什么waitpid只能针对子进程使用？&lt;/h3&gt;&#xA;&lt;p&gt;wait, waitpid, waitid 这三个系统函数都是为了等待进程状态发生变化。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;lt;sys/types.h&amp;gt;&#xA;#include &amp;lt;sys/wait.h&amp;gt;&#xA;&#xA;pid_t wait(int *status);&#xA;&#xA;pid_t waitpid(pid_t pid, int *status, int options);&#xA;&#xA;int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这三个系统调用都是用于等待调用进程的子进程的状态改变，并获取到子进程状态变化的相关信息。状态变化包括：子进程终止、子进程收到信号停止、子进程收到信号被唤醒。当进程退出的时候，会进程资源会被回收，但是包含进程pid、进程退出状态、资源使用信息等的一个“最小信息集”会被保留，会在进程表中占用一个位置。当父进程使用 wait 系列函数时可以获取到已经终止的子进程的最小信息集所含信息，同时这些信息被清理，占用的进程表资源被回收。如果父进程没有wait并回收掉已经终结的子进程的进程表资源，子进程就会成为僵尸进程（zombies）。如果进程资源始终占用着进程表资源，将进程表资源耗尽，使得系统无法再创建新的进程。如果父进程终止了，那么僵尸进程会被系统一号进程领养，并由一号进程自动执行 wait 调用，将僵尸进程清理、将所占用的资源回收。&lt;/p&gt;&#xA;&lt;p&gt;关于这个几个函数的使用细节可以查看 man 手册，有以下几点值得注意：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如果父进程在调用 wait 函数时，子进程的状态已经发生了变化，那么调用会立即返回，否则，会阻塞。但是这个行为可以通过options参数进行配置， options 是一个位控制参数， options 配置上 &lt;code&gt;WNOHANG&lt;/code&gt; 时可以是调用不阻塞，而是立即返回。&lt;/li&gt;&#xA;&lt;li&gt;默认情况下 wait 函数只等待 子进程退出进入终结态的情况，这个行为可以通过options参数进行配置，配置上 &lt;code&gt;WUNTRACED&lt;/code&gt; 时可以 wait 子进程进入 stop 状态，配置上 &lt;code&gt;WCONTINUED&lt;/code&gt; 可以 wait 处于 stop 状态中的进程被 SIGCONT 信号唤醒。&lt;/li&gt;&#xA;&lt;li&gt;status 参数不为 NULL 时，可以接受进程状态变化的相关信息，这些信息可以通过 相关宏对 status 处理得到。&lt;/li&gt;&#xA;&lt;li&gt;当 对非子进程调用 wait 系列函数时，会返回错误 ECHILD。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;当 对非子进程调用 wait 系列函数时，会返回错误 ECHILD。那么为什么呢？&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
