用 Docker 做演示 选用一个使用 debian12 bookworm 作为基础镜像的 python 镜像 FROM python:3.11.5-bookworm RUN echo "deb http://mirror.sjtu.edu.cn/debian bookworm main non-free contrib" > /etc/apt/sources.list 打包镜像 docker build -t "ponponon/image_search_engine:2023.09.07.1" . 打开容器 docker run -it --rm ponponon/image_search_engine:2023.09.07.1 bash 查看镜像文件 alias ll="ls -alh" cd /etc/apt/ cat sources.list 内容如下: root@49008ea43dda:/etc/apt# cat sources.list deb http://mirror.sjtu.edu.cn/debian bookworm main non-free contrib 确实只有 sjtu 了 但是当我执行 apt update 的时候 root@49008ea43dda:/etc/apt# apt update Get:1 http://mirror.sjtu.edu.cn/debian bookworm InRelease [151 kB] Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB] Get:3 http://mirror.sjtu.edu.cn/debian bookworm/main amd64 Packages [8906 kB] Get:4 http://mirror.sjtu.edu.cn/debian bookworm/non-free amd64 Packages [98.6 kB] Get:5 http://mirror.sjtu.edu.cn/debian bookworm/contrib amd64 Packages [54.3 kB] Get:6 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB] Get:7 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8906 kB] 59% [8 Packages 331 kB/8906 kB 4%]^C 为什么还会连接 "http://deb.debian.org/debian" 呢? *** 是的,正如「Feng_Yu」所说,所以要加一行 "RUN rm -rf /etc/apt/sources.list.d/*" «注意,海外不要删除,不然就废了。大陆要换成 aliyun 、中科大等 apt 镜像源的才需要这样操作» 完整的: FROM python:3.11.5-bookworm RUN rm -rf /etc/apt/sources.list.d/* RUN echo "deb http://mirror.sjtu.edu.cn/debian bookworm main non-free contrib" > /etc/apt/sources.list RUN apt update
搜索到的linux c更改命令行颜色为加上\033m 在尝试中发现如果使用>将结果保存到文件中 "./EXE_NAME > temp" 在文件会包含\033这些改变颜色的字符 但是对"ls"命令输出的文本带颜色,这样保存却不会有\033之类的字符串。 请问ls是采用其他改变颜色的方法吗?还是说我少做了啥。 感谢大佬
puppeteer官方Docker镜像:"https://pptr.nodejs.cn/guides/docker" (https://link.segmentfault.com/?enc=AnfmLzTduR5bBUnSvVyycw%3D%3D.OYOLZxiap7E%2BO9UTvxFX6zj%2FKpPhh0fNsPPXtEDssN6BNANqYGHavfKiMSGH4H5x) 现在我的需求是使用"express"创建接口,当调用接口传递链接,再puppeteer访问链接进行截图,截图后把截图上传阿里Oss,返回上传阿里Oss后的图片链接 我的想法是再打包一次: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250104/91ecdd52b97ba274db31f9af1d180daa.png) FROM ghcr.io/puppeteer/puppeteer 把官方镜像打包进行我们自己的Dockerfile,请大佬们这样可行吗?这个Dockerfile配置应该怎么写?请大佬指点下
╰─➤ ldd libx264-2881b7ff.so.164 linux-vdso.so.1 (0x00007fff1bec0000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9f37919000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f37d5c000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9f37d57000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f37600000) /lib64/ld-linux-x86-64.so.2 (0x00007f9f37d77000) 比如上面的输出,哪些是「绝对」,哪些是「相对」呢? 我觉得 "/lib64/ld-linux-x86-64.so.2 (0x00007f9f37d77000)" 是绝对 "linux-vdso.so.1 (0x00007fff1bec0000)" 是相对 但是类似 "libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f37d5c000)" 这样的算绝对还是相对引用呢?这里的 "=>" 表示什么含义呢? *** 我有一个问题,就是「如果没有 / ,那么就按找一个特定的方式在在磁盘上寻找这个文件。这个时候,ldd 会用 => 显示寻找的结果。」,我安装了一个 pyav,通过 "pip install av" 安装,然后我查看 av 的一个动态链接库 "ldd _core.cpython-310-x86_64-linux-gnu.so" ,发现这个动态链接库里面的 => 都是指向 "/home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs" 里面的某个文件,我不清楚这个「特定的方式」是什么? (svddb_sdk) ╭─pon@admini ~/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av ╰─➤ ldd _core.cpython-310-x86_64-linux-gnu.so linux-vdso.so.1 (0x00007ffc8db53000) libavformat-20d4e1d0.so.59.27.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavformat-20d4e1d0.so.59.27.100 (0x00007fd001254000) libavcodec-8a88085f.so.59.37.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavcodec-8a88085f.so.59.37.100 (0x00007fcffff37000) libavdevice-ed40abdd.so.59.7.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavdevice-ed40abdd.so.59.7.100 (0x00007fcffff18000) libavutil-1701948d.so.57.28.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavutil-1701948d.so.57.28.100 (0x00007fcfffd3a000) libavfilter-2d5314ec.so.8.44.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavfilter-2d5314ec.so.8.44.100 (0x00007fcfff8e9000) libswscale-a6aee226.so.6.7.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libswscale-a6aee226.so.6.7.100 (0x00007fcfff846000) libswresample-b868a3ce.so.4.7.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libswresample-b868a3ce.so.4.7.100 (0x00007fcfff824000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcfff7f5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcfff603000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcfff4b4000) libxml2-47a785fa.so.2.9.13 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxml2-47a785fa.so.2.9.13 (0x00007fcfff328000) libbluray-69850b93.so.2.1.2 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libbluray-69850b93.so.2.1.2 (0x00007fcfff2d3000) libgmp-dbb9f291.so.10.4.1 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libgmp-dbb9f291.so.10.4.1 (0x00007fcfff25a000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fcfff23e000) libgnutls-58994bd7.so.30.31.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libgnutls-58994bd7.so.30.31.0 (0x00007fcfff005000) libvpx-c1705a7a.so.7.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libvpx-c1705a7a.so.7.0.0 (0x00007fcffedf0000) liblzma-f3a5963b.so.5.2.5 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/liblzma-f3a5963b.so.5.2.5 (0x00007fcffedc5000) libdav1d-df61568f.so.5.1.1 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libdav1d-df61568f.so.5.1.1 (0x00007fcffebff000) libopencore-amrwb-9db94aa9.so.0.0.3 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libopencore-amrwb-9db94aa9.so.0.0.3 (0x00007fcffebe9000) libaom-e9efed4a.so.3.2.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libaom-e9efed4a.so.3.2.0 (0x00007fcffe4a9000) libmp3lame-3ecc6556.so.0.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libmp3lame-3ecc6556.so.0.0.0 (0x00007fcffe415000) libopencore-amrnb-393dbae2.so.0.0.3 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libopencore-amrnb-393dbae2.so.0.0.3 (0x00007fcffe3e7000) libopenjp2-0d101c52.so.2.4.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libopenjp2-0d101c52.so.2.4.0 (0x00007fcffe363000) libopus-70bda348.so.0.8.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libopus-70bda348.so.0.8.0 (0x00007fcffe307000) libspeex-b6a53f7a.so.1.5.1 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libspeex-b6a53f7a.so.1.5.1 (0x00007fcffe2eb000) libtheoraenc-276df146.so.1.1.2 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libtheoraenc-276df146.so.1.1.2 (0x00007fcffe2a9000) libtheoradec-f01ee89e.so.1.1.4 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libtheoradec-f01ee89e.so.1.1.4 (0x00007fcffe287000) libtwolame-72d74ef7.so.0.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libtwolame-72d74ef7.so.0.0.0 (0x00007fcffe25e000) libvorbis-f4a9a6fd.so.0.4.9 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libvorbis-f4a9a6fd.so.0.4.9 (0x00007fcffe221000) libvorbisenc-0d9d5bdf.so.2.0.12 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libvorbisenc-0d9d5bdf.so.2.0.12 (0x00007fcffe170000) libx264-2881b7ff.so.164 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libx264-2881b7ff.so.164 (0x00007fcffde4d000) libx265-d8690e8d.so.199 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libx265-d8690e8d.so.199 (0x00007fcffcbc1000) libxvidcore-d29bca61.so.4.3 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxvidcore-d29bca61.so.4.3 (0x00007fcffcab3000) libxcb-65da195c.so.1.1.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxcb-65da195c.so.1.1.0 (0x00007fcffc880000) libxcb-shm-7a199f70.so.0.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxcb-shm-7a199f70.so.0.0.0 (0x00007fcffc679000) libxcb-shape-25c2b258.so.0.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxcb-shape-25c2b258.so.0.0.0 (0x00007fcffc472000) libxcb-xfixes-9be3ba6f.so.0.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libxcb-xfixes-9be3ba6f.so.0.0.0 (0x00007fcffc262000) libpostproc-9d3ac700.so.56.6.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libpostproc-9d3ac700.so.56.6.100 (0x00007fcffc240000) libass-8499ab98.so.9.1.3 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libass-8499ab98.so.9.1.3 (0x00007fcffc1fe000) libfontconfig-99ba2620.so.1.12.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libfontconfig-99ba2620.so.1.12.0 (0x00007fcffc1aa000) libfreetype-19bd6cfb.so.6.17.1 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libfreetype-19bd6cfb.so.6.17.1 (0x00007fcffc0f9000) /lib64/ld-linux-x86-64.so.2 (0x00007fd0014fe000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcffc0f1000) libunistring-aeeab030.so.2.1.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libunistring-aeeab030.so.2.1.0 (0x00007fcffbf6a000) libnettle-cb75a9d6.so.8.4 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libnettle-cb75a9d6.so.8.4 (0x00007fcffbf1f000) libhogweed-5d799758.so.6.4 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libhogweed-5d799758.so.6.4 (0x00007fcffbece000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcffbcec000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcffbccf000) libogg-bbd52b06.so.0.8.5 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libogg-bbd52b06.so.0.8.5 (0x00007fcffbcc3000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fcffbcb9000) libXau-00ec42fe.so.6.0.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libXau-00ec42fe.so.6.0.0 (0x00007fcffbab4000) libfribidi-baef595b.so.0.4.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libfribidi-baef595b.so.0.4.0 (0x00007fcffba91000) libharfbuzz-d40f381a.so.0.40100.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libharfbuzz-d40f381a.so.0.40100.0 (0x00007fcffb97d000) libuuid-f64cda11.so.1.3.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libuuid-f64cda11.so.1.3.0 (0x00007fcffb777000) libpng16-1f529098.so.16.37.0 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libpng16-1f529098.so.16.37.0 (0x00007fcffb746000) 比如其中的 "libavformat-20d4e1d0.so.59.27.100 => /home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavformat-20d4e1d0.so.59.27.100 (0x00007fd001254000)" 这个是按照什么规定让 "libavformat-20d4e1d0.so.59.27.100" 指向 "/home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/libavformat-20d4e1d0.so.59.27.100 (0x00007fd001254000)" 的呢?按理来说,"/home/pon/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av/./../av.libs/" 不应该存在于系统的默认搜索路径中吧?而且我也没有添加类似 LD_LIBRARY_PATH、LD_PRELOAD、LD_LIBRARYN、LD_DEBUG、LD_BIND_NOW 的环境变量 (svddb_sdk) ╭─pon@admini ~/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av ╰─➤ printenv | grep LD_ 1 ↵ (svddb_sdk) ╭─pon@admini ~/.local/share/virtualenvs/svddb_sdk-qAt4tE2E/lib/python3.10/site-packages/av *** 如果使用 readelf 查看,就是下面这样 ─➤ readelf -d _core.cpython-310-x86_64-linux-gnu.so 1 ↵ Dynamic section at offset 0x2d000 contains 33 entries: Tag Type Name/Value 0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../av.libs] 0x0000000000000001 (NEEDED) Shared library: [libavformat-20d4e1d0.so.59.27.100] 0x0000000000000001 (NEEDED) Shared library: [libavcodec-8a88085f.so.59.37.100] 0x0000000000000001 (NEEDED) Shared library: [libavdevice-ed40abdd.so.59.7.100] 0x0000000000000001 (NEEDED) Shared library: [libavutil-1701948d.so.57.28.100] 0x0000000000000001 (NEEDED) Shared library: [libavfilter-2d5314ec.so.8.44.100] 0x0000000000000001 (NEEDED) Shared library: [libswscale-a6aee226.so.6.7.100] 0x0000000000000001 (NEEDED) Shared library: [libswresample-b868a3ce.so.4.7.100] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000c (INIT) 0x3000 0x000000000000000d (FINI) 0x63c4 0x0000000000000019 (INIT_ARRAY) 0x8cd8 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) 0x000000000000001a (FINI_ARRAY) 0x8ce0 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0xb358 0x0000000000000005 (STRTAB) 0x12250 0x0000000000000006 (SYMTAB) 0xa8d8 0x000000000000000a (STRSZ) 2479 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000003 (PLTGOT) 0x9000 0x0000000000000002 (PLTRELSZ) 2016 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x1e40 0x0000000000000007 (RELA) 0x17b0 0x0000000000000008 (RELASZ) 1680 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x16b0 0x000000006fffffff (VERNEEDNUM) 8 0x000000006ffffff0 (VERSYM) 0x15ce 0x000000006ffffff9 (RELACOUNT) 44 0x0000000000000000 (NULL) 0x0
https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241230/9bfaba6149783073d1dc67d154b76ffe.png
网络模型说到网络,你肯定经常提起七层负载均衡、四层负载均衡,或者三层设备、二层设备等等。那么,这里说的二层、三层、四层、七层又都是什么意思呢?实际上,这些层都来自国际标准化组织制定的 开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,OSI 模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能。其中,应用层,负责为应用程序提供统一的接口。表示层,负责把数据转换成兼容接收系统的格式。会话层,负责维护计算机之间的通信连接。传输层,负责为数据加上传输表头,形成数据包。网络层,负责数据的路由和转发。数据链路层,负责MAC寻址、错误侦测和改错。物理层,负责在物理网络中传输数据帧。但是 OSI 模型还是太复杂了,也没能提供一个可实现的方法。所以,在 Linux 中,我们实际上使用的是另一个更实用的四层模型,即 TCP/IP 网络模型。TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层,其中,应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。传输层,负责端到端的通信,比如 TCP、UDP 等。网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。TCP/IP 与 OSI 模型的关系如下所示:当然了,虽说 Linux 实际按照 TCP/IP 模型,实现了网络协议栈,但在平时的学习交流中,我们习惯上还是用 OSI 七层模型来描述。比如,说到七层和四层负载均衡,对应的分别是 OSI 模型中的应用层和传输层(而它们对应到 TCP/IP 模型中,实际上是四层和三层)。TCP/IP 模型包括了大量的网络协议,这些协议的原理以及核心基础知识。可以通过**《TCP/IP 详解》**的卷一和卷二进行学习。Linux网络栈有了 TCP/IP 模型后,在进行网络传输时,数据包就会按照协议栈,对上一层发来的数据进行逐层处理;然后封装上该层的协议头,再发送给下一层。当然,网络包在每一层的处理逻辑,都取决于各层采用的网络协议。比如在应用层,一个提供 REST API 的应用,可以使用 HTTP 协议,把它需要传输的 JSON 数据封装到 HTTP 协议中,然后向下传递给 TCP 层。而封装做的事情就很简单了,只是在原来的负载前后,增加固定格式的元数据,原始的负载数据并不会被修改。比如,以通过 TCP 协议通信的网络包为例,通过下面这张图,可以看到应用程序数据在每个层的封装格式。其中:传输层在应用程序数据前面增加了 TCP 头;网络层在 TCP 数据包前增加了 IP 头;而网络接口层,又在 IP 数据包前后分别增加了帧头和帧尾。这些新增的头部和尾部,都按照特定的协议格式填充,想了解具体格式,可以查看协议的文档。这些新增的头部和尾部,增加了网络包的大小,但我们都知道,物理链路中并不能传输任意大小的数据包。网络接口配置的最大传输单元(MTU),就规定了最大的 IP 包大小。在我们最常用的以太网中,MTU 默认值是 1500(这也是 Linux 的默认值)。一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于MTU 值。显然,MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。理解了 TCP/IP 网络模型和网络包的封装原理后,Linux 内核中的网络栈,其实也类似于 TCP/IP 的四层结构。如下图所示,就是 Linux 通用 IP 网络栈的示意图:我们从上到下来看这个网络栈,可以发现,最上层的应用程序,需要通过系统调用,来跟套接字接口进行交互;套接字的下面,就是前面提到的传输层、网络层和网络接口层;最底层,则是网卡驱动程序以及物理网卡设备。网卡作为发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中。而在网络收发过程中,内核通过中断跟网卡进行交互。再结合前面提到的 Linux 网络栈,可以看出,网络包的处理非常复杂。所以,网卡硬中断只处理最核心的网卡数据读取或发送,而协议栈中的大部分逻辑,都会放到软中断中处理。Linux网络收发流程了解了 Linux 网络栈后,我们再来看看, Linux 到底是怎么收发网络包的。注意,以下内容都以物理网卡为例。事实上,Linux 还支持众多的虚拟网络设备,而它们的网络收发流程会有一些差别。网络包的接收流程我们先来看网络包的接收流程。当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。比如,在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。传输层取出 TCP 头或者 UDP 头后,根据 <源 IP、源端口、目的 IP、目的端口> 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。流程图如下所示,这张图的左半部分表示接收流程,而图中的粉色箭头则表示网络包的处理路径。网络包的发送流程了解网络包的接收流程后,就很容易理解网络包的发送流程。网络包的发送流程就是上图的右半部分,很容易发现,网络包的发送方向,正好跟接收方向相反。首先,应用程序调用 Socket API(比如 sendmsg)发送网络包。由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。小结这篇文章梳理了 Linux 网络的工作原理。多台服务器通过网卡、交换机、路由器等网络设备连接到一起,构成了相互连接的网络。由于网络设备的异构性和网络协议的复杂性,国际标准化组织定义了一个七层的 OSI 网络模型,但是这个模型过于复杂,实际工作中的事实标准,是更为实用的 TCP/IP 模型。TCP/IP 模型,把网络互联的框架,分为应用层、传输层、网络层、网络接口层等四层,这也是 Linux 网络栈最核心的构成部分。应用程序通过套接字接口发送数据包,先要在网络协议栈中从上到下进行逐层处理,最终再送到网卡发送出去。而接收时,同样先经过网络栈从下到上的逐层处理,最终才会送到应用程序。
简而言之,就是这个文件被输入的内容,都会被吞没,发送到套接字(IP地址和端口号的组合)的另一边去. 我在做一个指令的输出的网络的重定向,它的格式大概是"xxx -l a.log",有一个叫a.log的输出文件作为记录. 我希望能做到,这个指令根据-l选项不断输出内容到a.log的同时,某个手段能把这些内容全都即时通过套接字传输到另一边. 甚至就不通过什么a.log,直接就有一个文件就代表着这个套接字. 肯请赐教. 我测试了nc指令的手段,把某个文件作为标准输入,进行套接字通信. 确实实现了我想要的效果,这个文件的内容被socket通信交到了另一边. 但有一个问题,那就是我在通信维持的同时继续向这个文件追加内容的话,它好像并不会把追加的内容也发过去.这种情况该怎么处理呢?
A用multiprocessing起了一个进程B,然后A断了,停了,怎么找B呢?
Hello!. 我发现system函数可以调用bash语句,但不能回收结果. 现在我的方案是中调用的bash语句里把输出重定向到某个文件,然后在C语言中去读那个文件的内容. 我感觉这样非常别扭,有没有更合适的方案?
参考:"https://github.com/nodesource/distributions" (https://link.segmentfault.com/?enc=T9cPjhDy5QPYlqHGJ9bFYg%3D%3D.1Vmn3KSXv%2BCcBkco%2B3LhBLpYgjYXL%2FV5b7pbD0qnxl%2Fgh80EjLG6qFO9KrnHnNEt) docker pull ubuntu:22.04 docker run --rm -it ubuntu:22.04 bash apt-get update apt-get install -y ca-certificates curl gnupg mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg NODE_MAJOR=16; echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list apt-get update apt-get install nodejs npm -y 报错 137 added, 0 removed; done. Setting up gpg-wks-server (2.2.27-3ubuntu2.1) ... Setting up libcurl4:amd64 (7.81.0-1ubuntu1.13) ... Setting up curl (7.81.0-1ubuntu1.13) ... Setting up gpg-wks-client (2.2.27-3ubuntu2.1) ... Setting up gnupg (2.2.27-3ubuntu2.1) ... Processing triggers for libc-bin (2.35-0ubuntu3.1) ... Processing triggers for ca-certificates (20230311ubuntu0.22.04.1) ... Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done. deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease Hit:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease Get:3 https://deb.nodesource.com/node_16.x nodistro InRelease [12.1 kB] Hit:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease Get:5 https://deb.nodesource.com/node_16.x nodistro/main amd64 Packages [7253 B] Hit:6 http://security.ubuntu.com/ubuntu jammy-security InRelease Fetched 19.4 kB in 6s (3210 B/s) Reading package lists... Done Reading package lists... Done Building dependency tree... Done Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: nodejs : Conflicts: npm npm : Depends: node-cacache but it is not going to be installed Depends: node-gyp but it is not going to be installed Depends: node-mkdirp but it is not going to be installed Depends: node-nopt but it is not going to be installed Depends: node-tar but it is not going to be installed Depends: node-which but it is not going to be installed Depends: nodejs:any (>= 10) Recommends: git but it is not going to be installed Recommends: node-tap but it is not going to be installed E: Unable to correct problems, you have held broken packages.