编程练习
subsection01 Linux系统、命令行、shell脚本
01 (7分)写一个脚本fibonacci.sh完成以下功能:执行此脚本则会在当前目录下创建一组共45个文件,文件名依次是0001.bin/0002.bin/0003.bin/0004.bin/...,文件大小分别是1/1/2/3/5/8/...字节,即文件大小遵循斐波那契数列;使用参数--clean执行此脚本则会将当前目录下创建的这组文件删除。
02 (7分)写一个脚本counter.sh完成以下功能:使用一个目录的路径做参数执行此脚本,则统计此目录下所有文件的字节数之和,并统计此目录下字节数大于1MB的文件的数目,将结果输出到标准输出;若目录下有子目录则要递归统计。
subsection02 C/C++
01 (6分)读取同目录下的特定文件input.txt,然后输出其中的全部行,但行排列次序变为按ASCII的次序降序排序。input.txt的内容:
Hello, world!
ello, world.
llo, world, he.
lo, world?
02 (7分)读取文件并输出其中的全部行,但行排列次序变为按中文拼音升序排序。与上一题相比,还有以下不同:文件路径需作为参数传入;假定内存紧张,所使用的内存空间只能比文件大小略大,且不能使用C++的数据结构;本题使用OS X命令行测试无法得到预期结果,但在Linux上可以得到预期结果。测试文件input.txt的内容:
张三
李四 王五
赵六
周吴郑王
subsection03 Unix/Linux系统编程
01 (8分)写一个程序,使用一个目录的路径做参数执行此程序,统计此目录下所有文件的字节数之和,并统计此目录下字节数大于1MB的文件的数目,将结果输出到标准输出;若目录下有子目录则要递归统计。
02 (8分)写一个程序,获取当前的Unix时间和本地时间并输出到标准输出:Unix时间精确到秒;本地时间的输出格式为yyyy-MM-dd HH:mm:ss.fff,即精确到毫秒;所谓本地时间是指以当地时区来表示的时间。
03 (6分)写一个程序,每隔一秒打印一行Hello,当捕捉到SIGQUIT或SIGTERM时终止程序,并在退出程序前打印Bye。测试方法为通过命令行向该程序的进程发送以上信号。
04 (9分)写一个程序,由主进程fork出一个子进程并通过消息队列向其发送自定义消息,子进程接收到约定的消息后打印child success并向父进程回复自定义消息,然后退出,父进程收到回复消息后打印parent success并退出。
05 (14分)写一个程序,由主线程创建4个新线程,4个新线程同时对一组共享的变量中的几个做自增运算,其中每个新线程对其所要做运算的共享变量做1e+9次自增运算,本题需要设计在C++11和非C++11下最快的实现,且打印耗时。共享变量如下:
int64_t p = 0; // 用于第1/2/3线程,最后应变为3e+9
int64_t q = 0; // 用于第1/2/4线程,最后应变为3e+9
int64_t r = 0; // 用于第1/3线程,最后应变为2e+9
int64_t s = 0; // 用于第1/2/3/4线程,最后应变为4e+9
subsection04 网络编程
01 (5分)写一个程序,获取计算机当前某个可用网卡的IPv4地址、掩码地址、广播地址、MAC地址,并输出到标准输出。
02 (9分)写一个程序,模拟服务器/客户端功能,客户端向服务器建立TCP连接,然后发送消息ping,服务器收到消息后回复pong,客户端收到回复后主动断开连接。服务器和客户端收到任何消息都要打印出来。
03 (14分)写一个程序,模拟服务器/客户端功能,客户端向服务器建立TCP连接,然后发送消息ping,服务器收到消息后回复pong,客户端收到回复后睡眠10秒然后主动断开连接。程序中要迅速向服务器建立1000个客户端连接,而服务器也要有能力尽可能高效处理此1000个连接。所有客户端都收到回复的消息后,打印出耗时。