使用netstat -natp可以看到进程的pid,但在busybox上的netstat 没有-p选项,就需要使用lsof了。

使用

lsof -i :9000

可以列出所有与9000端口号相关的进程pid

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

1.命令格式:

lsof 参数

2.命令功能:

用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。

lsof打开的文件可以是:

1.普通文件

2.目录

3.网络文件系统的文件

4.字符或设备文件

5.(函数)共享库

6.管道,命名管道

7.符号链接

8.网络文件(例如:NFS file、网络socket,unix域名socket)

9.还有其它类型的文件,等等

3.命令参数:

-a 列出打开文件存在的进程

-c<进程名> 列出指定进程所打开的文件

-g  列出GID号进程详情

-d<文件号> 列出占用该文件号的进程

+d<目录>  列出目录下被打开的文件

+D<目录>  递归列出目录下被打开的文件

-n<目录>  列出使用NFS的文件

-i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号> 列出指定进程号所打开的文件

-u  列出UID号进程详情

-h 显示帮助信息

-v 显示版本信息

4.使用实例:

实例1:无任何参数

命令:

lsof

输出:

[root@localhost ~]# lsof

COMMAND     PID USER   FD      TYPE             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
init          1 root   10u     FIFO               0,17                1233 /dev/initctl
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  rtd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
migration     4 root  cwd       DIR                8,2     4096          2 /
migration     4 root  rtd       DIR                8,2     4096          2 /
migration     4 root  txt   unknown                                        /proc/4/exe
ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
events/0      6 root  cwd       DIR                8,2     4096          2 /
events/0      6 root  rtd       DIR                8,2     4096          2 /
events/0      6 root  txt   unknown                                        /proc/6/exe
events/1      7 root  cwd       DIR                8,2     4096          2 /

说明:

lsof输出各列信息的意义如下:

COMMAND:进程的名称

PID:进程标识符

PPID:父进程标识符(需要指定-R参数)

USER:进程所有者

PGID:进程所属组

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等

(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序

(3)lnn:library references (AIX);

(4)er:FD information error (see NAME column);

(5)jld:jail directory (FreeBSD);

(6)ltx:shared library text (code and data);

(7)mxx :hex memory-mapped type number xx.

(8)m86:DOS Merge mapped file;

(9)mem:memory-mapped file;

(10)mmap:memory-mapped device;

(11)pd:parent directory;

(12)rtd:root directory;

(13)tr:kernel trace file (OpenBSD);

(14)v86  VP/ix mapped file;

(15)0:表示标准输出

(16)1:表示标准输入

(17)2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等

(1)u:表示该文件被打开并处于读取/写入模式

(2)r:表示该文件被打开并处于只读模式

(3)w:表示该文件被打开并处于

(4)空格:表示该文件的状态模式为unknow,且没有锁定

(5)-:表示该文件的状态模式为unknow,且被锁定

同时在文件状态模式后面,还跟着相关的锁

(1)N:for a Solaris NFS lock of unknown type;

(2)r:for read lock on part of the file;

(3)R:for a read lock on the entire file;

(4)w:for a write lock on part of the file;(文件的部分写锁)

(5)W:for a write lock on the entire file;(整个文件的写锁)

(6)u:for a read and write lock of any length;

(7)U:for a lock of unknown type;

(8)x:for an SCO OpenServer Xenix lock on part      of the file;

(9)X:for an SCO OpenServer Xenix lock on the      entire file;

(10)space:if there is no lock.

TYPE:文件类型,如DIR、REG等,常见的文件类型

(1)DIR:表示目录

(2)CHR:表示字符类型

(3)BLK:块设备类型

(4)UNIX: UNIX 域套接字

(5)FIFO:先进先出 (FIFO) 队列

(6)IPv4:网际协议 (IP) 套接字

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

实例2:查看谁正在使用某个文件,也就是说查找某个文件相关的进程

命令:

lsof /bin/bash

输出:

[root@localhost ~]# lsof /bin/bash
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
bash    24159 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24909 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24941 root txt    REG    8,2 801528 5368780 /bin/bash
[root@localhost ~]# 

 

说明:

实例3:递归查看某个目录的文件信息

命令:

lsof test/test3

输出:

[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# lsof test/test3
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    24941 root  cwd    DIR    8,2 4096 2258872 test/test3
vi      24976 root  cwd    DIR    8,2 4096 2258872 test/test3
[root@localhost soft]# 

 

说明:

使用了+D,对应目录下的所有子目录和文件都会被列出

实例4:不使用+D选项,遍历查看某个目录的所有文件信息的方法

命令:

 lsof |grep 'test/test3'

输出:

[root@localhost soft]# lsof |grep 'test/test3'

bash      24941 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root    4u      REG                8,2    12288    2258882 /opt/soft/test/test3/.log2013.log.swp
[root@localhost soft]# 
说明:

实例5:列出某个用户打开的文件信息

命令:

lsof -u username

说明: 

-u 选项,u其实是user的缩写

实例6:列出某个程序进程所打开的文件信息

命令:

lsof -c mysql

说明:

 -c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了

实例7:列出多个进程多个打开的文件信息

命令:

lsof -c mysql -c apache

实例8:列出某个用户以及某个进程所打开的文件信息

命令:

lsof  -u test -c mysql 

说明:

用户与进程可相关,也可以不相关

实例9:列出除了某个用户外的被打开的文件信息

命令:

lsof -u ^root

说明:

^这个符号在用户名之前,将会把是root用户打开的进程不让显示

实例10:通过某个进程号显示该进行打开的文件

命令:

lsof -p 1

实例11:列出多个进程号对应的文件信息

命令:

lsof -p 1,2,3

实例12:列出除了某个进程号,其他进程号所打开的文件信息

命令:

lsof -p ^1

实例13:列出所有的网络连接

命令:

lsof -i

实例14:列出所有tcp 网络连接信息

命令:

lsof -i tcp

实例15:列出所有udp网络连接信息

命令:

lsof -i udp

实例16:列出谁在使用某个端口

命令:

lsof -i :3306

实例17:列出谁在使用某个特定的udp端口

命令:

lsof -i udp:55

或者:特定的tcp端口

命令:

lsof -i tcp:80

实例18:列出某个用户的所有活跃的网络端口

命令:

lsof -a -u test -i

实例19:列出所有网络文件系统

命令:

lsof -N

实例20:域名socket文件

命令:

lsof -u

实例21:某个用户组所打开的文件信息

命令:

lsof -g 5555

实例22:根据文件描述列出对应的文件信息

命令:

lsof -d description(like 2)

例如:lsof  -d  txt

例如:lsof  -d  1

例如:lsof  -d  2

说明:

0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

实例23:根据文件描述范围列出文件信息

命令:

lsof -d 2-3

实例24:列出COMMAND列中包含字符串" sshd",且文件描符的类型为txt的文件信息

命令:

lsof -c sshd -a -d txt

输出:

[root@localhost soft]# lsof -c sshd -a -d txt
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
sshd     2756 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24155 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24905 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24937 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
[root@localhost soft]# 
[root@localhost soft]# 

 

实例25:列出被进程号为1234的进程所打开的所有IPV4 network files 

命令:

lsof -i 4 -a -p 1234

实例26:列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令

命令:

lsof -i @peida.linux:20,21,22,25,53,80  -r  3

Referenced from:https://www.cnblogs.com/peida/archive/2013/02/26/2932972.html

lsof stands for List Open Files.

It is easy to remember lsof command if you think of it as “ls + of”, where ls stands for list, and of stands for open files.

It is a command line utility which is used to list the information about the files that are opened by various processes. In unix, everything is a file, ( pipes, sockets, directories, devices, etc.). So by using lsof, you can get the information about any opened files.

  1. Introduction to lsof
    Simply typing lsof will provide a list of all open files belonging to all active processes.
# lsof

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 124704 917562 /sbin/init
init 1 root 0u CHR 1,3 0t0 4369 /dev/null
init 1 root 1u CHR 1,3 0t0 4369 /dev/null
init 1 root 2u CHR 1,3 0t0 4369 /dev/null
init 1 root 3r FIFO 0,8 0t0 6323 pipe
...
By default One file per line is displayed. Most of the columns are self explanatory. We will explain the details about couple of cryptic columns (FD and TYPE).

FD – Represents the file descriptor. Some of the values of FDs are,

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
NUMBER – Represent the actual file descriptor. The character after the number i.e ‘1u’, represents the mode in which the file is opened. r for read, w for write, u for read and write.
TYPE – Specifies the type of the file. Some of the values of TYPEs are,

REG – Regular File
DIR – Directory
FIFO – First In First Out
CHR – Character special file
For a complete list of FD & TYPE, refer man lsof.

  1. List processes which opened a specific file
    You can list only the processes which opened a specific file, by providing the filename as arguments.
# lsof /var/log/syslog

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog

  1. List opened files under a directory
    You can list the processes which opened files under a specified directory using ‘+D’ option. +D will recurse the sub directories also. If you don’t want lsof to recurse, then use ‘+d’ option.
# lsof +D /var/log/

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log
console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history

  1. List opened files based on process names starting with
    You can list the files opened by process names starting with a string, using ‘-c’ option. -c followed by the process name will list the files opened by the process starting with that processes name. You can give multiple -c switch on a single command line.
# lsof -c ssh -c init

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 8,1 124704 917562 /sbin/init
init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so
init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so
...
ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495

  1. List processes using a mount point
    Sometime when we try to umount a directory, the system will say “Device or Resource Busy” error. So we need to find out what are all the processes using the mount point and kill those processes to umount the directory. By using lsof we can find those processes.
# lsof /home

The following will also work.

# lsof +D /home/
  1. List files opened by a specific user
    In order to find the list of files opened by a specific users, use ‘-u’ option.
# lsof -u lakshmanan

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe
update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe
bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
Sometimes you may want to list files opened by all users, expect some 1 or 2. In that case you can use the ‘^’ to exclude only the particular user as follows

# lsof -u ^lakshmanan

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode
udisks-da 1584 root cwd DIR 8,1 4096 2 /
The above command listed all the files opened by all users, expect user ‘lakshmanan’.

  1. List all open files by a specific process
    You can list all the files opened by a specific process using ‘-p’ option. It will be helpful sometimes to get more information about a specific process.
# lsof -p 1753

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt
bash 1753 lakshmanan rtd DIR 8,1 4096 2 /
bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0
...

  1. Kill all process that belongs to a particular user
    When you want to kill all the processes which has files opened by a specific user, you can use ‘-t’ option to list output only the process id of the process, and pass it to kill as follows
# kill -9 `lsof -t -u lakshmanan`

The above command will kill all process belonging to user ‘lakshmanan’, which has files opened.

Similarly you can also use ‘-t’ in many ways. For example, to list process id of a process which opened /var/log/syslog can be done by

# lsof -t /var/log/syslog

489
Talking about kill, did you know that there are 4 Ways to Kill a Process?

  1. Combine more list options using OR/AND
    By default when you use more than one list option in lsof, they will be ORed. For example,
# lsof -u lakshmanan -c init

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 124704 917562 /sbin/init
bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2
bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2
...
The above command uses two list options, ‘-u’ and ‘-c’. So the command will list process belongs to user ‘lakshmanan’ as well as process name starts with ‘init’.

But when you want to list a process belongs to user ‘lakshmanan’ and the process name starts with ‘init’, you can use ‘-a’ option.

# lsof -u lakshmanan -c init -a

The above command will not output anything, because there is no such process named ‘init’ belonging to user ‘lakshmanan’.

  1. Execute lsof in repeat mode
  2. also support Repeat mode. It will first list files based on the given parameters, and delay for specified seconds and again list files based on the given parameters. It can be interrupted by a signal.

Repeat mode can be enabled by using ‘-r’ or ‘+r’. If ‘+r’ is used then, the repeat mode will end when no open files are found. ‘-r’ will continue to list,delay,list until a interrupt is given irrespective of files are opened or not.

Each cycle output will be separated by using ‘=======’. You also also specify the time delay as ‘-r’ | ‘+r’.

# lsof -u lakshmanan -c init -a -r5

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 /
inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash
inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so
inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so
inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4
inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4
inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4
inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh

In the above output, for the first 5 seconds, there is no output. After that a script named “inita.sh” is started, and it list the output.

Finding Network Connection
Network connections are also files. So we can find information about them by using lsof.

  1. List all network connections
    You can list all the network connections opened by using ‘-i’ option.
# lsof -i

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns
avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060
cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
You can also use ‘-i4’ or ‘-i6’ to list only ‘IPV4’ or ‘IPV6‘ respectively.

  1. List all network files in use by a specific process
    You can list all the network files which is being used by a process as follows
# lsof -i -a -p 234

You can also use the following

# lsof -i -a -c ssh

The above command will list the network files opened by the processes starting with ssh.

  1. List processes which are listening on a particular port
    You can list the processes which are listening on a particular port by using ‘-i’ with ‘:’ as follows
# lsof -i :25

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)

  1. List all TCP or UDP connections
    You can list all the TCP or UDP connections by specifying the protocol using ‘-i’.
# lsof -i tcp; lsof -i udp;
  1. List all Network File System ( NFS ) files
    You can list all the NFS files by using ‘-N’ option. The following lsof command will list all NFS files used by user ‘lakshmanan’.
# lsof -N -u lakshmanan -a

Referenced from:https://www.thegeekstuff.com/2012/08/lsof-command-examples/

You must #define NDEBUG (or use the flag -DNDEBUG with g++) this will disable assert as long as it's defined before the inclusion of the assert header file.

Using assert in C or C++ code is an excellent method to ensure correctness of pre-conditions and post-conditions in functions. Assertions are enabled by default in code compiled with GCC C and C++ compilers.

To disable assert, NDEBUG must be defined. You can choose to define this in your code as #define NDEBUG. Or you can pass -DNDEBUG to the GCC compiler while compiling the code.

If you use CMake, you can add it to CMakeLists.txt like this:

add_definitions(-DNDEBUG)
Referenced from:https://codeyarns.com/tech/2015-03-16-how-to-disable-assert-in-gcc.html

NDEBUG 作用

1、 NDEBUG宏是Standard C中定义的宏,专门用来控制assert()的行为。如果定义了这个宏,则assert不会起作用。

#ifdef NDEBUG
#define assert(x) ((void)0)
#else
...

2、 C Standard中规定了assert以宏来实现。<assert.h>被设计来可以被多次包含,其中一上来就undef assert,然后由NDEBUG宏来决定其行为。如:

#ifdef NDEBUG
    #undef NDEBUG
    #include <assert.h>
    #define NDEBUG
#else
    #include <assert.h>
#endif // #ifdef NDEBUG

将以上代码放在c/cpp最上方(当然,其后不能出现其它#include <assert.h>语句),就可以保证c/cpp所在的编译单元中的assert,在release下也会触发abort行为。
3、NDEBUG宏由于字面意思,也被用于作为判断debug/release版本的宏,不过这个是编译器、环境相关的,并不可靠。
比如vc中,对生成的release版本项目,默认会定义这个宏,而gcc并没有定义,得用-DNDEBUG参数来定义。
4、C++ Standard中完全采用了C中的定义。

assert() 函数用法
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include  <assert.h>
void  assert(  int  expression  );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:

#include  <stdio.h>
#include  <assert.h>
#include  <stdlib.h>
int  main(  void  )
{
              FILE  *fp;
              fp  =  fopen(  "test.txt",  "w"  );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
              assert(  fp  );                              //所以这里不会出错
              fclose(  fp  );
              fp  =  fopen("noexitfile.txt", "r");//以只读的方式打开一个文件,如果不存在就打开文件失败
              assert(fp);         //所以这里出错
              fclose(fp);        //程序永远都执行不到这里来
              return  0;
}

[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.

使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include  <stdio.h>
#define  NDEBUG
#include  <assert.h>

用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:

int  resetBufferSize(int  nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize  缓冲区新长度
//返回值:缓冲区当前长度 
//说明:保持原信息内容不变          nNewSize<=0表示清除缓冲区
assert(nNewSize  >=  0);
assert(nNewSize  <=  MAX_BUFFER_SIZE);
...
}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好:  assert(nOffset>=0  &&  nOffset+nSize<=m_nInfomationSize);
好:  assert(nOffset  >=  0);
assert(nOffset+nSize  <=  m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误:  assert(i++  <  100)

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

正确:  assert(i  <  100)
                  i++; 

               

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤

《世上最美丽的离别》,为韩国tvN于2017年12月9日起播出的周末连续剧,由《Dear My Friends》洪锺灿导演执导与卢熙京作家再次合作打造。此剧讲述一位平凡的母亲在人生的最后时光里,与家人重归于好享受最后亲情的感人故事。

电影《世上最美的离别》改编自韩国作家卢熙庆的同名原著及电视剧。卢熙庆因怀念自己因癌症去世的母亲而写就这本小说中刻画了一个平凡又伟大的母亲的一生。
  母亲(裴宗玉 饰)在婆婆身患老年痴呆后辛苦照顾她15年,只身挑起家中重担,为一家人操劳不休。而丈夫(金甲洙 饰)对家事丝毫不关心,女儿爱上了有妇之夫,儿子也面临着高考的艰难形势。家庭中的每个人似乎都有各自的烦恼各自的事情。她去丈夫上班的医院看病,丈夫却因为自己是一名薪资低的医生而不愿意在工作的地方见到她;她去看上班的女儿,想约她一起吃一顿午餐,哪怕只是简单的一碗乌冬面,而女儿却忙着和情人约会,推脱她;她心疼的儿子,考上了大学一身轻松,和女朋友约会喝酒,过自己的快意生活。而她却在此时被查出患有膀胱癌,并处于癌症末期的情况下。在发现母亲即将离世时,家中每一个人的态度都发生了改变.....

磁力链

magnet:?xt=urn:btih:D5C3271E249B6AD208E398C499451599968C55CE

世上最美丽的离别 电视剧:
《世上最美丽的离别》(韩语:세상에서 가장 아름다운 이별,英语:The Most Beautiful Goodbye),为韩国tvN于2017年12月9日起播出的周末连续剧,由《Dear My Friends》洪锺灿导演执导与卢熙京作家再次合作打造。此剧讲述一位平凡的母亲在人生的最后时光里,与家人重归于好享受最后亲情的感人故事。

此剧为1996年播出的《世上最美丽的离别》重拍版,除新增的在英一角外,所有剧集角色皆与1996年版相同。

剧情简介 · · · · · ·
  仁熙(元美京 饰)的一生,是大部分韩国女性都会度过的寻常一生。和丈夫郑哲(刘东根 饰)结婚多年,夫妻两人早已如同最亲密的陌生人一般不分彼此。大女儿妍秀(崔智友 饰)的人生大事迟迟没有着落,儿子廷秀(崔珉豪 饰)连续落榜了三次,苦苦挣扎在书本和成绩之中。患有老年痴呆的婆婆(金英玉 饰)总是给仁熙惹麻烦,但仁熙依然毫无怨言的将照顾她当做是自己分内的事情。
  就是这样一个非常普通的女人,经医生诊断患上了癌症,已是晚期,留给她的时间最多还有两个月。一辈子操劳的仁熙会选择如何度过这段生命里最后的时光呢?

该剧改编自日本电视剧《不需要爱情的夏天》。
  这也是宋慧乔第二次与金圭泰导演和卢熙京作家合作。
  赌徒吴树(赵寅成 饰)生活在充斥着金钱和欲望的扑克牌世界里,过着华丽无比的生活,每天晚上除了扑克就是跟女人和酒在一起。因一次意外身负数十亿韩元的债务,于是将目光投向富家女吴英(宋慧乔 饰)。吴英作为大企业唯一的继承人,聪明、美丽,似乎拥有一切,但是内心却孤独冷落。不幸的她患上了可以模糊的看到视野中心部分,看不见周围的“隧道视觉障碍”。为了金钱,吴树带着亲如手足的镇城(金范 饰),假扮成吴英10多年未见过的哥哥,一起来到吴英的家中。玩世不恭的他发现吴英和自己一样孤独和伤心,渐渐对她产生情愫。而吴英也被这个哥哥谎言般温暖的话语和行动以及自由自在的魅力所动容,慢慢开始向他敞开心扉。而最终,当真实与谎言碰撞,当一切构建起来的美好被打碎,两人将面对怎么的结局呢?

《那年冬天风在吹》(韩语:그 겨울, 바람이 분다,英语:That Winter, The Wind Blows)为韩国SBS自2013年2月13日起播出的水木迷你连续剧,改编自日本电视剧《不需要爱情的夏天》,由《他们的世界》、《Padam Padam》的编剧卢熙京和导演金圭泰联手打造。安七炫担任OST制作人,并亲自创作部分歌曲之词曲。赵寅成在《春日》后时隔8年复出电视剧场,而宋慧乔在《他们的世界》后时隔5年再度与卢熙京作家合作。
棉花糖之吻
原作以夏天为背景,结合冰冷、愤世嫉俗、孤独感为主旋律;此剧所营造的氛围正好相反,赋予冬天寒冷凄惨的形象热情洋溢的一面来描绘韩式浪漫。自2012年11月起开镜,首播前已完成8集的拍摄量,为半事前制作电视剧。因为演员们良好的视觉效果,再加上实力演技做后盾,剧中大量采用以往在广告及音乐录影带中才会运用的脸孔特写镜头,透过眼神、表情演绎展现感情戏,提升观众的集中力。剧中赵寅成与宋慧乔的“棉花糖之吻”,浪漫唯美桥段获选为“2013最经典戏码”。

magnet:?xt=urn:btih:c25a12e200ba7a7a80b2e42e20cd7d91a7c0db20

magnet:?xt=urn:btih:40052380b32b20f82969e300ee6295f6665c43ab

不需要爱的夏天 (豆瓣)
update:2021-11-10
不需要爱的夏天的剧情简介 · · · · · ·
  继承父亲庞大遗产的少女鹰园亚子(广末凉子 饰)深处黑暗之中,不管是眼睛还是心灵;新宿歌舞伎町的王牌牛郎白鸟凌志(渡部笃郎 饰)成天把爱挂在嘴边,却是最不相信爱的人。因为一次意外让凌志背负巨额债款且被告之只有2个月的偿还期限,与亚子失散多年的哥哥意外丧生且与凌志同名,让凌 志注意上了亚子,开始了一场目的明确的欺诈之旅。
  二个不相信爱的人相遇在这个危险的夏天,亚子像个刺猬,让凌志擅长的角色扮演无从发挥,同时又发觉自己与亚子某部分的相像。还款期限在一天天减少,名为哥哥的凌志却沉浸在自己构建的谎言之中。最终,当真实与谎言碰撞,当一切构建起来的美好被打碎,这个夏天将以什么方式结束呢?
Referenced from:https://movie.douban.com/subject/1759770/

《不需要爱情的夏天》(日语:愛なんていらねえよ、夏),2002年7月12日至9月13日,于日本TBS电视台每周五22点播出的10回电视剧,渡部笃郎主演,时段为周五连续剧,平均收视率7.8%。

不相信爱情无药可救的男女彼此邂逅,并发现爱情存在的故事。我们虽然无法透过肉眼看见“爱”,但要相信爱是无所不在的。
不需要爱情的夏天
在歌舞伎町担任牛郎的礼治(Reiji),涉嫌教唆女客人盗用公款而遭警方逮捕。半年后等待着礼治的,居然是七亿三千万的债务与朋友的叛变。如果两个月内不能还债,将是死路一条,走投无路的礼治只好暂时住在因为车祸身亡的小弟礼慈(Reiji)家中。此时一名自称真壁恭一的律师出现在礼治面前。律师转述住在镰仓豪宅里的千金小姐·鹰园亚子正在寻找自幼分离的哥哥礼慈,而真壁律师看见礼慈的遗物误以为礼治(Reiji)就是他要找的礼慈(Reiji)。同时礼治得知亚子刚继承了一笔十亿的遗产,就图谋用她的财产来偿还欠债,以亚子哥哥的身份进入鹰园家。对把欺骗女性当作工作一样的礼治来说,拢络小姑娘当然是易如反掌,但她其实是个顽固而封闭内心的盲眼少女......

电驴下载(人人影视字幕):
Ai.Nante.Irane.Yo,Natsu.E01.DVDrip.x264.AC3-YYeTs.mkv (349.32MB)
Ai.Nante.Irane.Yo,Natsu.E02.DVDrip.x264.AC3-YYeTs.mkv (349.84MB)
Ai.Nante.Irane.Yo,Natsu.E03.DVDrip.x264.AC3-YYeTs.mkv (349.3MB)
Ai.Nante.Irane.Yo,Natsu.E04.DVDrip.x264.AC3-YYeTs.mkv (349.14MB)
Ai.Nante.Irane.Yo,Natsu.E05.DVDrip.x264.AC3-YYeTs.mkv (349.13MB)
Ai.Nante.Irane.Yo,Natsu.E06.DVDrip.x264.AC3-YYeTs.mkv (349.49MB)
Ai.Nante.Irane.Yo,Natsu.E07.DVDrip.x264.AC3-YYeTs.mkv (349.6MB)
Ai.Nante.Irane.Yo,Natsu.E08.DVDrip.x264.AC3-YYeTs.mkv (349.33MB)
Ai.Nante.Irane.Yo,Natsu.E09.DVDrip.x264.AC3-YYeTs.mkv (349.28MB)
Ai.Nante.Irane.Yo,Natsu.E10end.DVDrip.x264.AC3-YYeTs.mkv (349.95MB)
Referenced from:https://www.rijupao.com/posts/10396.html

GPIO的基础知识
       GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO口一是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。几乎所有的CPU、MCU都会具GPIO功能,以下是作者统计的GPIO的种类,几乎囊括了所有的MCU的GPIO类型。
gpio-input.png
输入浮空(Floating):即输入端口既不上拉(Pull up)也不下拉(Pull down),电平由外部输入决定;这种模式较少,一般模拟量输入、按键扫描输入使用该模式。
输入上拉(Pull up):即输入端口配置一个电阻接到电源(Power)端,该电阻可以使用芯片内置,也可以是外部电阻。
输入下拉(Pull down):即输入端口配置一个电阻到地(Ground),该电阻可以使用芯片内置,也可以是外部电阻。
模拟输入:模拟量信号输入,需要芯片内部支持AD转换功能才可以。
开漏输出: 漏极开路输出(OD) 和集电极开路输出(OC)十分相似,都是无法输出高电平,只能输出低电平,需要高电平时需要外接上拉电阻。
推挽式输出:推挽输出既可以输出高电平也可以输出低电平,无需外配置电阻。
推挽式复用功能:即推挽式输出和输入功能,使用时需要配置具体使用哪一种(雙方向端口,需要首先配置方向)。
开漏复用功能:即开漏输出和输入功能,使用时需要配置具体使用哪一种。
 
上下拉电阻作用
上拉(Pull up)就是将不确定的信号(X態)通过一个电阻嵌位在高电平(High),电阻同时起限流作用;下拉同理,下拉(Pull down)就是将不确定的信号(X態)通过一个电阻嵌位在低电平(Low),电阻同时起限流作用。
上拉(Pull Up)是对器件注入电流,下拉(Pull down)是输出电流。
弱强只是上拉电阻的阻值不同,没有什么严格区分。
对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻(Pull-up resistor)的功能主要是为集电极开路输出(OC)型电路输出电流通道。
一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接。
上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是我们通常所说的灌电流。
在I/O引脚悬空时,接电阻就是为了防止输入端悬空,从而提高系统的抗干扰能力。减弱外部电流对芯片产生的干扰。
通过上拉或下拉来增加或减小驱动电流。
上下拉电阻改变电平的电位,常用在TTL-CMOS匹配。
上拉电阻可以为OC门或者OD门提供电流。
Referenced from:https://blog.csdn.net/gsjthxy/article/details/106551565