Books Girls searchsearch
Hotgirlsfilm H
tgr Girls G Girls r Books s
iE Hotgirlsfilm %search7 Girls A0searchE7% Hotgirlsfilm 0 Hotgirlsfilm 81 Books Esearch%09%A Hotgirlsfilm %search6%8 Books %search5searchE7Red%20Hot%20Jam%20Vol.94%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%8F%E3%83%BC%E3%83%95%E6%97%85%E9%A4%A8%20%E5%A5%B3%E5%B0%86%E3%81%A8%E5%A8%98~%E3%81%BE%E3%81%AA%E3%81%8B%EF%BD%9C%E4%B8%83%E7%80%AC%E8%88%9E(Manaka%EF%BD%9CMai%20Nanase)8 Girls %8 Girls % Books E5E6% Hotgirlsfilm 3%9 Books % Books 5%searchB%B Books % Books 5A9% Hotgirlsfilm A Books E5searchAsearch%search6searchE8 Girls 8 Hotgirlsfilm %B7%E6 Girls 8 Hotgirlsfilm % Hotgirlsfilm 5
S Hotgirlsfilm u Girls r Hotgirlsfilm isearchVieXtreme%20Movie%20Manager%20%C6%C6%BD%E2i Girls ssearchsesearchH Girls t Books irs Hotgirlsfilm isearchmjapanese%20girl%20wetrs Books asearchcsearchh Books isearchlsearch
Hotgirlsfilm osearchgsearchr Hotgirlsfilm sf Girls l Hotgirlsfilm searchse Girls r Hotgirlsfilm h Girls h
search Hotgirlsfilm Girls Hotgirlsfilm Books Hotgirlsfilm Hotgirlsfilm search Girls search Girls Books Books 20 Girls Books Hotgirlsfilm Girls Hotgirlsfilm Books Hotgirlsfilm Girls search Hotgirlsfilm %BC%AB%C6%B7%C3%C0%C5%AE%B1%BB%BA%DA%B0%EF%C0%CF%B4%F3%B5%B1%D6%DA%C7%BF%B2%E5 Hotgirlsfilm
search Girls Books 
Books search Girls searchsearch Hotgirlsfilm Hotgirlsfilm Hotgirlsfilm searchsearch Hotgirlsfilm search1 Girls Hotgirlsfilm search Books Books Books
在一个应用程序里用到system函数来执行系统命令,开始时死活也获取不了正确的返回码。几经调试后发现是设置了信号处理,将信号处理部分注释掉,就可以正常获取到system的返回码了。
不过,这时又遇到了新问题。fork子进程执行后,会变成defunct状态(僵尸进程)。于是在程序里面加入了wait,等待子进程结束后收尸。问题看起来是解决了,能获取到system返回状态,又解决了僵尸进程。
但是,又有新问题来了。由于使用wait,它会无条件的等待子进程结束后,才让父进程继续工作。因为它是堵塞执行的。
也因此而导致无法多个子进程并发工作。只有第一个子进程结束后,才会执行第二个子进程。
后来的解决办法,是采用两次fork来解决。先fork一个子进程,我们叫它子进程 A吧。在子进程A里再fork多个子进程来执行具体任务,当然是并发的。用那个wait来接收子进程A结束状态,避免僵尸进程出现。至于子进程A fork出来的子进程,由于子进程A结束了,这些子进程就变成了无主进程,就被init接管,执行结束了,就退出被内核回收,也就没有僵尸进程了。
通过这个应用程序,理解了屏蔽子进程信号,会导致system返回值异常;如果不wait(还有其他相关的wait函数),子进程就会变成僵尸进程。
Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包。可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字。
这里我们将通过一些实例来学习 netcat 命令。
1. 在服务器-客户端架构上使用 Netcat
netcat 工具可运行于服务器模式,侦听指定端口
1
$ nc -l 2389
然后你可以使用客户端模式来连接到 2389 端口:
1
$ nc localhost 2389
现在如果你输入一些文本,它将被发送到服务器端:
1
$ nc localhost 2389
2
HI, oschina
在服务器的终端窗口将会显示下面内容:
1
$ nc -l 2389
2
HI, oschina
2. 使用 Netcat 来传输文件
netcat 工具还可用来传输文件,在客户端,假设我们有一个 testfile 文件:
1
$ cat testfile
2
hello oschina
而在服务器端有一个空文件名为 test
然后我们使用如下命令来启用服务器端:
1
$ nc -l 2389 > test
紧接着运行客户端:
1
cat testfile | nc localhost 2389
然后你停止服务器端,你可以查看 test 内容就是刚才客户端传过来的 testfile 文件的内容:
1
$ cat test
2
hello oschina
3. Netcat 支持超时控制
多数情况我们不希望连接一直保持,那么我们可以使用 -w 参数来指定连接的空闲超时时间,该参数紧接一个数值,代表秒数,如果连接超过指定时间则连接会被终止。
服务器:
1
nc -l 2389
客户端:
1
$ nc -w 10 localhost 2389
该连接将在 10 秒后中断。
注意: 不要在服务器端同时使用 -w 和 -l 参数,因为 -w 参数将在服务器端无效果。
4. Netcat 支持 IPv6
netcat 的 -4 和 -6 参数用来指定 IP 地址类型,分别是 IPv4 和 IPv6:
服务器端:
1
$ nc -4 -l 2389
客户端:
1
$ nc -4 localhost 2389
然后我们可以使用 netstat 命令来查看网络的情况:
1
$ netstat | grep 2389
2
tcp 0 0 localhost:2389 localhost:50851 ESTABLISHED
3
tcp 0 0 localhost:50851 localhost:2389 ESTABLISHED
接下来我们看看IPv6 的情况:
服务器端:
1
$ nc -6 -l 2389
客户端:
1
$ nc -6 localhost 2389
再次运行 netstat 命令:
1
$ netstat | grep 2389
2
tcp6 0 0 localhost:2389 localhost:33234 ESTABLISHED
3
tcp6 0 0 localhost:33234 localhost:2389 ESTABLISHED
前缀是 tcp6 表示使用的是 IPv6 的地址。
5. 在 Netcat 中禁止从标准输入中读取数据
该功能使用 -d 参数,请看下面例子:
服务器端:
1
$ nc -l 2389
客户端:
1
$ nc -d localhost 2389
2
Hi
你输入的 Hi 文本并不会送到服务器端。
6. 强制 Netcat 服务器端保持启动状态
如果连接到服务器的客户端断开连接,那么服务器端也会跟着退出。
服务器端:
1
$ nc -l 2389
客户端:
1
$ nc localhost 2389
2
^C
服务器端:
1
$ nc -l 2389
2
$
上述例子中,但客户端断开时服务器端也立即退出。
我们可以通过 -k 参数来控制让服务器不会因为客户端的断开连接而退出。
服务器端:
1
$ nc -k -l 2389
客户端:
1
$ nc localhost 2389
2
^C
服务器端:
1
$ nc -k -l 2389
7. 配置 Netcat 客户端不会因为 EOF 而退出
Netcat 客户端可以通过 -q 参数来控制接收到 EOF 后隔多长时间才退出,该参数的单位是秒:
客户端使用如下方式启动:
1
nc -q 5 localhost 2389
现在如果客户端接收到 EOF ,它将等待 5 秒后退出。
8. 使用 Netcat 来处理 UDP 协议
netcat 默认是使用 TCP 协议,但也支持 UDP,可使用 -u 参数来启用 UDP 协议通讯。
服务器端:
1
$ nc -4 -u -l 2389
客户端:
1
$ nc -4 -u localhost 2389
这样客户端和服务器端都使用了 UDP 协议,可通过 netstat 命令来查看:
1
$ netstat | grep 2389
2
udp 0 0 localhost:42634 localhost:2389 ESTABLISHED
英文原文, OSCHINA原创翻译