Linux C 系统编程 2-1 进程管理 进程环境

2023-11-15

该系列文章总纲链接:专题分纲目录 LinuxC 系统编程​​​​​​​


本章节思维导图如下所示(思维导图会持续迭代):

第一层:

第二层:


1 进程的启动和退出

1.1 流程

程序启动 -> 程序加载 & 地址分配 -> 程序退出

@1 程序启动:对于二进制文件:

  1. 如果文件在usr/bin或者/bin文件夹下等在PATH环境变量中已经指定的地址中,则直接输入二进制文件的名字即可
  2. 若不在PATH环境变量下,则用 程序路径 程序名(例如./hello)的方式也可以。
  3. 若不在PATH环境变量下却想直接输入二进制名就能执行文件则将程序路径添加到PATH环境变量里面,将二进制文件移动到PATH环境变量的目录中。

@2 程序加载,地址分配:

加载的简单过程如下:

  1. 从目标文件中读取足够的头部信息,找出需要多少地址空间。
  2. 分配地址空间,如果目标代码的格式具有独立的段,那就将地址空间按独立的段来划分。
  3. 将程序读入地址空间的段中。
  4. 将程序末尾的bss段空间填充为0(如果虚拟内存系统部自动这么做的话)。
  5. 创建一个堆栈(若体系结构需要的话)。
  6. 设置运行信息,比如程序参数、环境变量等。
  7. 开始运行程序,从_start入口,找到main,开始顺序执行程序。

@3 程序退出:

一般退出有3种方式:

  1. 进程自愿退出。这体现在exit函数和return函数上。退出时,需要回收进程所分配的资源(比如地址空间、文件描述符等),操作系统会对每一项资源进行善后处理。    
  2. 进程收到一个信号退出。这种情况很常见,往往是父进程对其子进程的终止操作。这一操作实际上是父进程向子进程发送了一个终止信号,子进程接收到信号后也会资自愿退出。
  3. 进程执行了一个导致异常的操作后退出。上面两种情况都是在程序预期之下退出的,而异常的操作是在程序没有准备的情况下退出的。这时候操作系统对其资源进行回收,但是可能不会对这些资源进行善后处理。异常实际上是一种向进程发送了一个特殊的信号,但是发送信号的不是某一个进程而是操作系统本身。

1.2 进程终止处理函数

linux环境下允许在进程退出的时候调用一些用户自定义的函数,这些函数称为终止处理函数。linux规定最多可以设置32个这样的进程终止处理函数。linux下使用atexit函数设置进程终止处理函数。atexit函数的原型:

#include <stdlib.h>
int atexit(void (*function)(void));

详细见linux函数参考手册。注意:

  1. 函数执行成功返回0,失败返回非零值。(注意,atexit函数执行失败时不是返回-1)
  2. 进程终止处理函数的调用顺序与设置的时候相反。(后调用的先结束,类似于栈的结构)         
  3. 实际上,进程终止函数是在进程结束的时候进行的一些辅助性的操作。

2 linux进程内存管理

2.1 大端与小端

一般的PC机采用的是小端的结构,而server一般采用大端结构。这种数据存储的差别并不是由操作系统造成的,大端与小端体现在CPU的体系结构上。一般对其进行编程的时候要先判断是否是大端还是小端,之后对其进行操作。

小端:高地址存高位,低地址存低位。大端:与小端相反。

2.2 代码段、数据段与bss段

@1 代码段:一般是不允许进行写操作的,属性是只读。一个程序多数情况下不需要更改代码段,只有一种情况除外,那就是升级程序,对于server而言,要在不停止程序的情况下完成代码段部分内容的更换。以前一般就是对代码段进行写的操作,直接更换,但是这样风险也很大。现在一般用共享库的方式来解决这个问题。

@2 数据段:

  1. 初始化数据段(.data):包含程序中明确给定初值的全局变量和静态变量。
  2. 块存储段(.bss):存储在这个段中的数据通常是没有明确给定初值的全局变量和静态变量。

@3 bss段中的内容并不作为程序文件中的一部分,也就是不包含在二进制文件中,而是被保存在外存上,系统仅仅是在内存中标记了bss段的一些信息(初始化变量大小、属性等);以便于运行程序的时候能够找到bss段中的内容。如果全局变量/静态变量本身有给定的值,而这个值是0/NULL的时候,编译器会将其内容写到bss段,而不是data段中。

2.3 栈与堆

自动变量有3种存储方式:

  1. bss段:静态局部变量
  2. 寄存器里:寄存器变量
  3. 栈:一般自动变量

这里面在编程的时候最常见的错误就是将一个指向局部变量的指针作为函数的返回值返回。由于指针指向的内容还在栈帧上,函数只是将其地址返回。因此如果栈帧被其他函数覆盖,返回的指针指向的内存区域的值也就失效了。

堆空间一般是存储用户申请的内存空间,堆上的操作往往是malloc。栈与堆的位置往往是相对的,但是具体的分配要看处理器的存储结构,与大端小端的差别是类似的。

2.4 常量存储

对于一个简单的常量来说,它是存储在代码段里,因为简单变量的长度是固定的。这样可以加快取指令的速度,还可以提高程序的效率。但那是对于字符串这种复杂的常量而言,其长度不定,如果将字符串存储在代码段中,会导致代码段很大,同时不利于处理器进行代码读入缓冲处理,大大影响程序的执行效率。所以最后单独弄出一个段来存储字符串。

2.5 动态内存管理

系统使用mem_control_block结构管理所有已经分配的内存块,结构如下:

    struct mem_control_block{
      int is_available;     //该块是否可用
      int size;               //块的大小
    }

通过这个结构可以简单的实现malloc函数,整个流程如下:

malloc函数首先将用户要分配的字节数加上一个“内存控制块”的大小,得出实际需要分配的字节数。

  1. 之后顺序遍历堆中所有的内存块,如果该块可用且大于实际需要的字节数,则将该内存块的首地址返回并将该块设置为可用,否则尝试下一个内存块。
  2. 如果所有的内存块都不满足条件,则调用sbrk函数(如果sbrk函数失败,则系统中没有可用的内存了,malloc函数返回NULL),通过操作系统分配一块内存。malloc函数将这块内存拓展在堆内,相当于堆增长了。
  3. 跳过该块内存的“内存控制结构”,将最后一块内存的末地址重新设置。

对于free函数的一些说明: free函数的主要工作就是将内存控制块设置为可用。当下一次调用malloc函数的时候就可以将该内存块作为可分配块进行分配了。因此在调用free函数之后,该内存块中的内容不会立刻消失,但那是这时此内容已经不受操作系统的保护,因此有效的时间也是随机的。


3 shell环境

命令行参数和环境变量这两个信息都是从父进程获得的,其获取方式也不同。
命令行参数作为main函数的参数被传送到新进程中,而环境变量是作为一种全局变量被新进程所使用的。

3.1 命令行参数与应用

argc:命令行参数的个数;
argv:指向参数的各个指针所构成的数组;

这里的argv[0]表示可执行程序的整个路径名,并不只是可执行程序的文件名。(要想通过路径名得到文件名需要进行相应的字符处理);argv[argc]一定是NULL。

3.2 环境变量

每个程序都会有一个环境变量表,和命令行参数一样,环境变量表也是一个指针数组。包含相应的头文件,在程序中写入extern char **environ;通过读environ[i]一直循环直到environ[i] = NULL就可以得到环境变量表,即每个环境变量的值。

注意:在本进程中修改环境变量没有意义,因为不会影响到其他的进程。

环境变量的设置、获取、删除函数原型如下:

#include <stdlib.h>
char *getenv(const char *name);//获取环境变量,成功则返回环境变量的值,失败则返回NULL。
int put(char* str);            //将 name==value的字符串放进环境表,如果原来有值则覆盖。
int setenv(const char *name, const char *value, int overwrite);//设置环境变量,这里第3个参数rewrite的值为0则:不修改原来的值;非0值则:修改原来的值。
int unsetenv(const char *name);//删除一个环境变量的值,成功返回0,失败返回-1。
int clearenv();         //此函数会将整个environ这个指针置为NULL,成功返回0,失败返回-1。

详细见linux函数参考手册。以上对这些环境变量的操作的函数仅对其本身的进程和子进程有影响,对于父进程没有影响。

3.3 获取进程结束状态

$?是linux shell中的一个内置变量,其中保存的是最近一次运行程序的返回值。有3中情况:

  1. 程序中的main函数运行结束,$?中保存main函数的返回值。
  2. 程序运行中调用exit函数结束运行,$?保存的是exit函数的参数。
  3. 程序异常退出,$?中保存异常出错的错误号。

注意:

  1. 如果程序运行出错,那么$?内置变量中的值是1。所以在编写代码的时候,如果代码没有问题,则不要返回1(exit(1)或者return(1))。以免引起不必要的混乱。
  2. 如果main函数没有返回一个指定的值,那么$?中的值不是随机的,切记!
  3. 由于linux shell中$?中内置的变量的值实际上是进程结束后eax寄存器的值(仅在X86体系结构下),所以看到的是linux系统在此结构体系中使用eax保存每个函数的返回值。这个值针对不同的系统是不同的。

3.4 使用errno调试程序

调试一个程序的方法往往有以下几种:

  • 使用调试器
  • 在程序中直接使用输出函数输出调试信息
  • 查看标准出错文件
  • 程序异常时所写的日志

在linux下执行系统调用的时候会出现一些错误,仅仅通过检查这些系统调用的返回值是不够的,开发者往往需要更加详细的信息。C语言提供了一个全局变量errno,使用时加上头文件<errno.h>,这个全局变量很好地弥补了返回值信息不足的缺点。errno为0表示没有错误,如果出错则输出错误号。使用的时候一定要先清0,因为是全局变量。

常见errno的定义及解读如下表所示:

C Name Value Description 含义
Success 0 Success 成功
EPERM 1 Operation not permitted 操作不允许
ENOENT 2 No such file or directory 没有这样的文件或目录
ESRCH 3 No such process 没有这样的过程
EINTR 4 Interrupted system call 系统调用被中断
EIO 5 I/O error I/O错误
ENXIO 6 No such device or address 没有这样的设备或地址
E2BIG 7 Arg list too long 参数列表太长
ENOEXEC 8 Exec format error 执行格式错误
EBADF 9 Bad file number 坏的文件描述符
ECHILD 10 No child processes 没有子进程
EAGAIN 11 Try again 资源暂时不可用
ENOMEM 12 Out of memory 内存溢出
EACCES 13 Permission denied 拒绝许可
EFAULT 14 Bad address 错误的地址
ENOTBLK 15 Block device required 块设备请求
EBUSY 16 Device or resource busy 设备或资源忙
EEXIST 17 File exists 文件存在
EXDEV 18 Cross-device link 无效的交叉链接
ENODEV 19 No such device 设备不存在
ENOTDIR 20 Not a directory 不是一个目录
EISDIR 21 Is a directory 是一个目录
EINVAL 22 Invalid argument 无效的参数
ENFILE* 23 File table overflow 打开太多的文件系统
EMFILE 24 Too many open files 打开的文件过多
ENOTTY 25 Not a tty device 不是tty设备
ETXTBSY 26 Text file busy 文本文件忙
EFBIG 27 File too large 文件太大
ENOSPC 28 No space left on device 设备上没有空间
ESPIPE 29 Illegal seek 非法移位
EROFS 30 Read-only file system 只读文件系统
EMLINK 31 Too many links 太多的链接
EPIPE 32 Broken pipe 管道破裂
EDOM 33 Math argument out of domain 数值结果超出范围
ERANGE 34 Math result not representable 数值结果不具代表性
EDEADLK 35 Resource deadlock would occur 资源死锁错误
ENAMETOOLONG 36 Filename too long 文件名太长
ENOLCK 37 No record locks available 没有可用锁
ENOSYS 38 Function not implemented 功能没有实现
ENOTEMPTY 39 Directory not empty 目录不空
ELOOP 40 Too many symbolic links encountered 符号链接层次太多
EWOULDBLOCK 41 Same as EAGAIN 和EAGAIN一样
ENOMSG 42 No message of desired type 没有期望类型的消息
EIDRM 43 Identifier removed 标识符删除
ECHRNG 44 Channel number out of range 频道数目超出范围
EL2NSYNC 45 Level 2 not synchronized 2级不同步
EL3HLT 46 Level 3 halted 3级中断
EL3RST 47 Level 3 reset 3级复位
ELNRNG 48 Link number out of range 链接数超出范围
EUNATCH 49 Protocol driver not attached 协议驱动程序没有连接
ENOCSI 50 No CSI structure available 没有可用CSI结构
EL2HLT 51 Level 2 halted 2级中断
EBADE 52 Invalid exchange 无效的交换
EBADR 53 Invalid request descriptor 请求描述符无效
EXFULL 54 Exchange full 交换全
ENOANO 55 No anode 没有阳极
EBADRQC 56 Invalid request code 无效的请求代码
EBADSLT 57 Invalid slot 无效的槽
EDEADLOCK 58 Same as EDEADLK 和EDEADLK一样
EBFONT 59 Bad font file format 错误的字体文件格式
ENOSTR 60 Device not a stream 设备不是字符流
ENODATA 61 No data available 无可用数据
ETIME 62 Timer expired 计时器过期
ENOSR 63 Out of streams resources 流资源溢出
ENONET 64 Machine is not on the network 机器不上网
ENOPKG 65 Package not installed 没有安装软件包
EREMOTE 66 Object is remote 对象是远程的
ENOLINK 67 Link has been severed 联系被切断
EADV 68 Advertise error 广告的错误
ESRMNT 69 Srmount error srmount错误
ECOMM 70 Communication error on send 发送时的通讯错误
EPROTO 71 Protocol error 协议错误
EMULTIHOP 72 Multihop attempted 多跳尝试
EDOTDOT 73 RFS specific error RFS特定的错误
EBADMSG 74 Not a data message 非数据消息
EOVERFLOW 75 Value too large for defined data type 值太大,对于定义数据类型
ENOTUNIQ 76 Name not unique on network 名不是唯一的网络
EBADFD 77 File descriptor in bad state 文件描述符在坏状态
EREMCHG 78 Remote address changed 远程地址改变了
ELIBACC 79 Cannot access a needed shared library 无法访问必要的共享库
ELIBBAD 80 Accessing a corrupted shared library 访问损坏的共享库
ELIBSCN 81 A .lib section in an .out is corrupted 库段. out损坏
ELIBMAX 82 Linking in too many shared libraries 试图链接太多的共享库
ELIBEXEC 83 Cannot exec a shared library directly 不能直接执行一个共享库
EILSEQ 84 Illegal byte sequence 无效的或不完整的多字节或宽字符
ERESTART 85 Interrupted system call should be restarted 应该重新启动中断的系统调用
ESTRPIPE 86 Streams pipe error 流管错误
EUSERS 87 Too many users 用户太多
ENOTSOCK 88 Socket operation on non-socket 套接字操作在非套接字上
EDESTADDRREQ 89 Destination address required 需要目标地址
EMSGSIZE 90 Message too long 消息太长
EPROTOTYPE 91 Protocol wrong type for socket socket协议类型错误
ENOPROTOOPT 92 Protocol not available 协议不可用
EPROTONOSUPPORT 93 Protocol not supported 不支持的协议
ESOCKTNOSUPPORT 94 Socket type not supported 套接字类型不受支持
EOPNOTSUPP 95 Operation not supported on transport 不支持的操作
EPFNOSUPPORT 96 Protocol family not supported 不支持的协议族
EAFNOSUPPORT 97 Address family not supported by protocol 协议不支持的地址
EADDRINUSE 98 Address already in use 地址已在使用
EADDRNOTAVAIL 99 Cannot assign requested address 无法分配请求的地址
ENETDOWN 100 Network is down 网络瘫痪
ENETUNREACH 101 Network is unreachable 网络不可达
ENETRESET 102 Network dropped 网络连接丢失
ECONNABORTED 103 Software caused connection 软件导致连接中断
ECONNRESET 104 Connection reset by 连接被重置
ENOBUFS 105 No buffer space available 没有可用的缓冲空间
EISCONN 106 Transport endpoint 传输端点已经连接
ENOTCONN 107 Transport endpoint 传输终点没有连接
ESHUTDOWN 108 Cannot send after transport 传输后无法发送
ETOOMANYREFS 109 Too many references 太多的参考
ETIMEDOUT 110 Connection timed 连接超时
ECONNREFUSED 111 Connection refused 拒绝连接
EHOSTDOWN 112 Host is down 主机已关闭
EHOSTUNREACH 113 No route to host 没有主机的路由
EALREADY 114 Operation already 已运行
EINPROGRESS 115 Operation now in 正在运行
ESTALE 116 Stale NFS file handle 陈旧的NFS文件句柄
EUCLEAN 117 Structure needs cleaning 结构需要清洗
ENOTNAM 118 Not a XENIX-named 不是XENIX命名的
ENAVAIL 119 No XENIX semaphores 没有XENIX信号量
EISNAM 120 Is a named type file 是一个命名的文件类型
EREMOTEIO 121 Remote I/O error 远程输入/输出错误
EDQUOT 122 Quota exceeded 超出磁盘配额
ENOMEDIUM 123 No medium found 没有磁盘被发现
EMEDIUMTYPE 124 Wrong medium type 错误的媒体类型
ECANCELED 125 Operation Canceled 取消操作
ENOKEY 126 Required key not available 所需键不可用
EKEYEXPIRED 127 Key has expired 关键已过期
EKEYREVOKED 128 Key has been revoked 关键被撤销
EKEYREJECTED 129 Key was rejected by service 关键被拒绝服务
EOWNERDEAD 130 Owner died 所有者死亡
ENOTRECOVERABLE 131 State not recoverable 状态不可恢复
ERFKILL 132 Operation not possible due to RF-kill 由于RF-kill而无法操作

3.5 输出错误原因

errno只是一个整型值,必须查表才能知道,要想更加方便地查找错误,可以利用两个函数,这两个函数提供了错误号到信息的转换:strerror和perror。strerror函数的原型:

#include <string.h>
char *strerror(int errnum);

详细见linux函数参考手册。perror函数的原型:

#include <stdio.h>
void perror(const char *s);

详细见linux函数参考手册

注意:该字符串不要加‘\n’,系统会自动加。这样的好处是可以少传送一个参数;坏处是perror是无缓冲的,是一个有副作用的函数,其职能是输出离该函数调用最近的一个系统函数的出错原因。    

4 全局跳转

goto语句是一个只能在函数内部跳转的语句,即这种跳转是局部的,对于全局跳转,goto语句是无力的。要想全局跳转,则需要那种全局跳转的语句。

linux下使用setjump函数和longjump函数实现全局跳转。这种跳转的思路是先设置一个跳转点,保存当前的函数调用栈帧。当程序执行全局跳转,回到跳转点的时候,要实现函数栈帧的还原。linux下使用jmp_buf结构保存当前的栈帧,再跳转的时候将该结构中的栈帧还原即可。linux下使用setjmp函数设置一个全局的跳转点,函数原型如下:

#include <setjmp.h>
int setjmp(jmp_buf env);

详细见linux函数参考手册。接下来 使用 longjmp函数执行全局跳转,即直接跳转到 setjmp的后一句,无论是在哪里,也无论是嵌套了几层函数,都能跳转回来,函数原型如下:

#include <setjmp.h>
void longjmp(jmp_buf env, int val);

详细见linux函数参考手册。使用全局跳转,程序的结构更好控制,代码也会变得紧凑。使用全局跳转是一个比较高级的应用,全局跳转需要操作系统的协助,而局部跳转不需要。局部跳转实现在语言层面上,而且注意goto只是C语言的一个关键字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C 系统编程 2-1 进程管理 进程环境 的相关文章

  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的

随机推荐

  • 中国传统节日端午节网页HTML代码 学生网页课程设计期末作业下载 春节大学生网页设计制作成品下载 DW春节节日网页作业代码下载

    HTML5期末大作业 节日网站设计 中国传统节日端午节网页HTML代码 7页 HTML CSS JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网页设计作业题材有 个人 美食 公司
  • visio技巧(曲线、连接点、自制模具)

    一 画曲线 1 1 铅笔 任意多边形 弧形都可以画曲线 但曲度不好更改 1 2 鼠标选中连接线 在画布上画一个直角线 选中该线 点击右键 选曲线连接线 随意拉动该线上的连接点可以调整成任意曲度 二 增加 移动 删除图形上的连接点 1 1 增
  • 【Python 基础篇】Python代码 之 程序结构

    目录 前言 一 顺序结构 1 1 分支结构 1 2 双向分支 1 3 多路分支 1 4 if语句补充 二 顺序结构 三 循环结构 while while else for in for else 四 流程控制语句 break continu
  • SparkStreaming知识总结

    一 流式计算的概述 1 1 什么是流式计算 1 数据流与静态数据的区别 数据流指的就是不断产生的数据 是源源不断 不会停止 静态数据指的就是存储在磁盘中的固定的数据 2 流式计算的概念 就是对数据流进行计算 由于数据是炼苗不断的产生的 所以
  • VMware15.5安装win7旗舰版系统

    1 启动vmware 文件 新建虚拟机 2 选择自定义安装 下一步 3 兼容性默认不做修改 下一步 4 安装来源选择稍后安装操作系统 5 选择windows7 64 6 安装位置选择非系统盘位置 放在C盘会拖累系统运行速度 7 8 取决于物
  • PostgreSQL_row_number() over()

    语法 row number over partition by col1 order by col2 desc row number 为返回的记录定义各行编号 pritition by 分组 order by 排序 实例 实例数据来源 利用
  • vue实现文件下载

    原理 a href url 复制代码 实际使用场景 上面的原理中适合开放的资源下载 http请求中无需验证时使用 在实际使用过程中 a标签中的url中直接设置header比较麻烦且不安全 而且从开发规范上api一般上要封装一下 header
  • 华为OD机试 - 最多颜色的车辆(Java)

    题目描述 在一个狭小的路口 每秒只能通过一辆车 假设车辆的颜色只有 3 种 找出 N 秒内经过的最多颜色的车辆数量 三种颜色编号为0 1 2 输入描述 第一行输入的是通过的车辆颜色信息 0 1 1 2 代表4 秒钟通过的车辆颜色分别是 0
  • LeetCode 2545. 根据第 K 场考试的分数排序

    班里有 m 位学生 共计划组织 n 场考试 给你一个下标从 0 开始 大小为 m x n 的整数矩阵 score 其中每一行对应一位学生 而 score i j 表示第 i 位学生在第 j 场考试取得的分数 矩阵 score 包含的整数 互
  • git忽略指定文件夹

    git忽略指定文件夹 如下结构 总共有三个文件夹 假设要忽略第一层的B文件夹 在目录下新建一个 gitignore文件 并填写下面内容 B 假设要忽略第一层的A文件夹 在文件中填写A 的话 会把B文件夹下的A文件夹也忽略了 这个时候可以加上
  • 要称王,先做行业破坏者

    author skate time 2010 06 18 高端阅读78期 原标题为 世界 油王 的职场启示 我的人生 狠 字当头 有极强的故事性 白手起家 狂赚几亿美元 后遭朋友暗算 被踢出一手创办并成功发展40年的公司 同期不得不应对麻烦
  • Linux nrm 运行失败,解决:npm中 下载速度慢 和(无法将“nrm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次)...

    1 解决下载速度 因为我们npm下载默认是 连接国外的服务器 所以网速不是特别好的时候 可能下不了包 安装nrm 使用 npm i nrm g 我们的一般工具包都是下载到全局 安装完毕之后 可以运行 命令 nrm ls ls 表示 list
  • Django-Model层ORM之查询操作(六)

    目录 一 Django查询相关API all 查询所有记录 返回一个集合对象 filter 属性 根据条件查询 返回一个集合对象 first 和 last 查询第一个和最后一个记录 返回单个对象 get id 2 根据id查询 返回一个对象
  • Ubuntu 15.04 下编译Caffe2

    深度学习大神贾扬清在四月底发布了最新框架Caffe2 最近在Ubuntu15 04下编译了它的源代码 遇到一些坑 记录下来以供参考 基本安装次序如官网所述 https caffe2 ai docs getting started html
  • k8s Trouble Shooting 故障排除

    本文要讲的是k8s的故障排除 比较浅 最近刚入门 主要涵盖的内容是查看k8s对象的当前运行时信息 对于服务 容器的问题是如何诊断的 对于某些复杂的问题例如pod调度问题是如何排查的 1 查看系统的Event事件 在对象资源 pod serv
  • 一起写一个 Web 服务器

    http my oschina net leejun2005 blog 486771 一起写一个 Web 服务器 2 2015 06 06 实践项目 9 评论 Web服务器 分享到 8 本文由 伯乐在线 高世界 翻译 艾凌风 校稿 未经许可
  • java实现评论功能_Java实现评论回复功能的完整步骤

    前言 使用递归循环开发评论回复功能 适用于大部分的简单单体应用 评论功能或许是大多数的单体应用之中会用到的功能 我们会在自己所开发的项目之中进行集成该功能 大多数时候我们会将评论功能划分成以下几种 单一型 嵌套型 两层型 一 分类方式 1
  • SAP B/P 初步研究(二)

    从开发人员角度来看 B P客户创建可以试用两种方法 第一种是使用BAPI FUNCTION 第二种是使用BAPI CALL METHOD 个人更倾向于使用METHOD 因为METHOD方法只需要填充一个嵌套结构就可以实现B P所有业务视图的
  • 【STM32】制作一个bootloader

    工作环境 STM32CubeMX Keil 相关环境准备这里就不介绍了 bootloader是什么 bootloader就是单片机启动时候运行的一段小程序 这段程序负责单片机固件的更新 也就是单片机选择性的自己给自己下载程序 可以更新 可以
  • Linux C 系统编程 2-1 进程管理 进程环境

    该系列文章总纲链接 专题分纲目录 LinuxC 系统编程 本章节思维导图如下所示 思维导图会持续迭代 第一层 第二层 1 进程的启动和退出 1 1 流程 程序启动 gt 程序加载 地址分配 gt 程序退出 1 程序启动 对于二进制文件 如果