C always uses pass by value. You can simulate pass by reference yourself, by defining functions which accept pointers and then using the & operator when calling, and the compiler will essentially simulate it for you when you pass an array to a function
在没有 #inlcude <stdlib.h> 就使用malloc时,编译器会认为malloc的返回值是 int 类型,如果不使用显式的类型转换,编译器会抛出一个隐式类型转换警告,而如果使用了显式类型转换则不会抛出这个警告(而导致潜在的错误)。
Suppose that you call malloc but forget to #include <stdlib.h>. The compiler is likely to assume that malloc is a function returning int, which is of course incorrect, and will lead to trouble.
You can store the result of malloc into any pointer variable without a cast, because ISO C automatically converts the type void * to another type of pointer when necessary. But the cast is necessary in contexts other than assignment operators or if you might want your code to run in traditional C.
ISO C11:
The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement and then used to access such an object or an array of such objects in the space allocated (until the space is explicitly deallocated)
typedef struct book { char title[20]; float price; } Book; Book cspp;
这样使用更见方便,也更见常见。
一些奇特的声明
这里记录几个比较有用的:
int *reisks[10]; // 表示具有10个元素的数组,每个元素是一个指向int的指针 int (*risks)[10]; // 一个指针,指向具有10个元素的int数组 int *oof[3][4]; // 一个 3×4的数组,每个元素是一个指向int的指针 int (* uuf)[3][4]; // 一个指针,指向 3×4的int数组 int (* uof[3])[4]; // 一个具有3个元素的数组,每个元素是一个指向具有4个元素的int数组的指针
可以看到二级命令非常多,很难记。最常用的是 ip addr 也可以简写为 ip a(ip命令中更有很多这种简写方法)。操作网络地址相关内容,比如列出ip地址,添加ip地址,删除ip等待。
ip addr show # Only show TCP/IP IPv4 ip -4 a # Only show TCP/IP IPv4 ip -6 a
# show eth0 interface ip a show eth0
# show on running interface ip link ls up
# add/del ip address ip a add {ip_addr/mask} dev {intereface} [label label_name] // 可选的设置一个label ip addr add 192.168.0.123/24 dev eth0
#remove ip address ip a del {ip_addr} dev {interface} ip addr del 192.168.0.123 dev eth0
# flush ip address; delete all the IP addresses matches # 可以flush一个地址或者一个label标记的所有地址 ip a flush label "label" ip -s a f to 192.168.2.0/24 // -s 输出统计信息 to limit to given IP address/prefix
# up or down a device ip link set dev {interface} {up|down} ip l set dev eth0 down
ip link set 命令可以设置很多的值,看一下自动补全提示:
$ ip l set <tab> address -- specify unicast link layer (MAC) ad arp -- change ARP flag on device brd -- specify broadcast link layer (MAC) broadcast -- specify broadcast link layer (MAC) dev -- specify device down -- change state do down dynamic -- change DYNAMIC flag on device mtu -- specify maximum transmit unit multicast -- change MULTICAST flag on device name -- change name of device peer -- specify peer link layer (MAC) addre promisc -- set promiscious mode txqlen -- specify length of transmit queue txqueuelen -- specify length of transmit queue up -- change state to up
一般用法都是 ip link set {cmd} dev {interface}。比如设置mtu:
ip link set mtu 3000 dev eth0
ip命令还能查看与邻近节点(neighbour)的可达性:
ip n show // same as ip neigh show ip n add {ip_addr} lladdr {MAC/LLADDRESS} dev {interface} nud {perm|noarp|stale|reachable} ip n del {ip_addr} dev eth0
会输出附近节点的arp信息。可以手动添加这些arp条目。
路由表信息也由ip命令提供,使用route/r 子命令操作:
# list route table ip r ip r list 192.168.0.0/24 ip r add {default} {network/mask} dev {interface} ip r add (default) {network/mask} via {gateway_ip} ip r del default ip r del network/mask dev wth0
ip命令远比上面介绍的部分复杂,这里不能一一列出了,使用一个带tab补全的终端非常有用,另外虽然ifconfig命令没有了,但是基于图形用户界面的 nmtui (network management text user interface) 还是预装了,可以用它来配置ip/DNS等。如果没有安装,使用下面的命令安装: sudo yum install NetworkManager-tui -y。
ss 命令
ss是另一个很重要的工具,ss是socket statistics的缩写,用于代替之前使用netstat命令。ss能够显示比netstat更多的信息并且速度也更快。netstat是从 /proc 下的文件中读取信息再整理显示的,而 ss 命令直接从内核空间获取信息。
ss的man页面介绍如下:
ss - another utility to investigate sockets
直接执行 ss 会列出当前所有已建立的非监听的(non-listening)连接,一个常用的参数 -ntl,参数意义为:
-n –numeric,显示端口数字而不是服务名字,比如显示 80 而不是 http
-t –tcp, 即显示 tcp 套接字,同理常用 -u 表示 udo 套接字
-l –listening,也好理解,默认不显示监听的套接字,这个参数指明只显示监听中的套接字
-4 –ipv4也是常用的,在查看服务监听状态时,常指定 -4 或者 -6 结果更加清晰
-p –processes,显示使用这个套接字的进程id,这个参数需要 sudo 权限
-s –summary,显示套接字使用的统计信息
-o –options,显示相关的时间信息
还可以更具套接字状态过滤输出,比如下面的命令:
ss -t4 state established ss -t4 state time-wait
连接的状态有很多中,常用如下:
established
syn-sent
syn-recv
time-wait
closed
closing
all
connected
还可以通过指定dport和sport过滤输出:
# 还可以使用 or,666 ss -nt dst :443 or dst :80 // dport 大于1024的连接 ss -nt dst gt :1024