- 博客(125)
- 收藏
- 关注
原创 Linux网络驱动示例之snull网络接口(三):测试验证
1. 编译得到.ko文件后用insmod snull.ko添加模块; 2. 在/etc/networks中添加网络号: snullnet0 192.168.0.0 snullnet1 192.168.1.0 3. 在/etc/hosts中添加主机IP号: 192.168.0.1 local0 192.168.0.2 remote0 192.168.1...
2020-01-07 17:06:40
596
原创 Linux网络驱动示例之snull网络接口(二):设备方法的实现
上一节描述了snull网络接口的入口和出口函数,在入口函数分配一个net_device,用snull_init函数初始化net_device的成员,之后注册这个网络设备。初始化net_device成员主要是实现一些设备操作方法,如下所示: static const struct net_device_ops snull_dev_ops = { .ndo_open = s...
2020-01-07 16:33:55
928
原创 Linux网络驱动示例之snull网络接口(一):总体框架
《Linux设备驱动程序》(第三版)第十七章以snull网络接口为例讲解了网络驱动程序的设计,本文分析了snull这个示例,并对驱动程序做了一些简化和修改,只保留该程序的核心功能,并在2.6.31版本的内核上测试运行。 1. 入口和出口函数 Linux网络设备驱动基本是围绕net_device这个结构做文章,程序的入口函数中主要是分配并注册net_device结构体,对...
2020-01-06 16:33:00
1624
1
原创 Linux设备驱动并发控制的简单总结
设备驱动中并发控制的常用机制:中断屏蔽,原子操作,自旋锁,互斥量。 1. 中断屏蔽: Linux的进程调度都使用中断实现,屏蔽中断也就屏蔽了内核抢占引起的并发问题,但是中断屏蔽只针对本CPU,不能解决多 个CPU引起的竞争。 local_irq_disable(); //屏蔽中断 local_irq_enable(); //开中断 ...
2019-11-12 13:05:20
216
原创 C++ Primer(第五版) 7.4--7.6节练习
7.33 pos位于类的作用域之外,无法直接使用,应改为Screen::pos。 7.34 放在最后一行无法通过编译,声明中使用的名字,包括返回类型和参数列表使用的名字,都必须在使用前确保可见。 7.35 typedef string Type; Type iniVal(); //Type为string class Exercise { public: t...
2019-10-25 12:56:53
763
原创 C++ Primer(第五版) 7.3.1--7.3.4节练习
7.23 #ifndef SCREEN_H #define SCREEN_H class Screen { public: using pos = std::string::size_type; Screen() = default; Screen(pos ht, pos wd): height(ht), width(wd), contents(ht * wd, ' ') { ...
2019-10-24 14:49:40
618
原创 C++ Primer(第五版)7.2--7.2.1节练习
7.16 访问说明符指定其后成员的访问级别,其出现次数没有严格规定,有效范围直到出现下一个访问说明符或到达类结尾。可在整个程序内被访问的成员定义为public的;只能被类的成员函数访问,不能被使用该类的代码访问,定义为private的。 7.17 默认访问权限不同,struct所有成员是public的,class所有成员是private的。 7.18 封装可以隐藏类的实现细节...
2019-10-24 11:56:52
396
原创 C++ Primer(第五版)7.1.4节练习
7.11 添加构造函数 struct Sales_data { Sales_data()= default; Sales_data(const string &s): bookNo(s) { } Sales_data(const string &s, unsigned n, double p): bookNo(s), units_sold(n), reve...
2019-10-24 11:30:53
417
原创 C++ Primer(第五版) 7.1.1--7.1.3节练习
7.1 Sales_data类: #ifndef SALES_DATA_H #define SALES_DATA_H #include <iostream> #include <string> using namespace std; struct Sales_data { string bookNo; unsigned units_sold = 0; ...
2019-10-22 10:45:44
540
原创 C++ Primer(第五版) 6.6--6.7节练习
6.49 函数匹配时,对应的重载函数集称为候选函数;考察提供的实参,候选函数中能够被这组实参调用的函数,叫做可行函数。 6.50 (a) 二义性调用,无法匹配; (b) 精确匹配void f(int); (c) 精确匹配void f(int, int); (d) 精确匹配void f(double, double); ...
2019-10-18 12:46:18
384
原创 C++ Primer(第五版) 6.5.1--6.5.3节练习
6.40 (b) 错误,ht被赋予默认值,则其后的所有形参都必须有默认值。 6.41 (a) 非法,至少要提供第一个参数; (b) 合法; (c) 合法,但不符合预期,'*'被传递给第二个参数。 6.42 #include <iostream> using namespace std; string make...
2019-10-18 12:05:07
381
原创 C++ Primer(第五版)6.3.2--6.4节练习
6.30 1)for循环中的return没有返回值,编译器报错; 2)for循环之后没有return语句,编译器无法发现这一错误。 6.31 当引用绑定的是函数的局部变量时,返回的引用或常量引用都是无效的。 6.32 合法。功能是把数组按照其索引号赋值。get函数接受一个数组指针和索引号为参数,返回数组该元素的引用,然后在main函数的for循环中赋值。...
2019-10-18 10:49:05
578
原创 C++ Primer(第五版)6.2.4--6.2.6节练习
6.21 int cmp(const int a, const int *p) { return (a > *p)? a : *p; } 6.22 #include <iostream> using namespace std; void myswap(int *&p1, int *&p2) { auto temp = p1; ...
2019-10-17 12:25:23
560
2
原创 C++ Primer(第五版)6.2.1--6.2.3节练习
6.10 #include <iostream> using namespace std; void iswap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1, b = 2; cout << a << " " <<...
2019-10-17 11:34:55
362
原创 C++ Primer(第五版) 6.1--6.1.3节练习
6.1 函数定义中的参数是形参;调用函数时所用的参数为实参。实参是形参的初始值。 6.2 (a) 函数定义的返回值为int,函数体中返回值为string,不匹配; (b) 缺少返回类型; (c) 形参名字重复; (d) 缺少花括号。 6.3 int fact(int val) { if (val > 1) ...
2019-10-16 10:16:21
408
原创 C++ Primer(第五版) 5.4.1--5.6.3节练习
5.14 #include <iostream> #include <vector> using namespace std; //统计单词及次数的数据结构 struct wcnt { string word; int cnt; }; int main() { string word; vector<string> svec; w...
2019-10-15 12:12:43
281
原创 C++ Primer(第五版) 5.1--5.3.2节练习
5.1 只有一个单独分号的语句是空语句;当语法需要但逻辑上不需要时用到空语句; 5.2 复合语句也被称作块,是指用花括号括起来的语句和声明序列;语法上需要一条语句,但逻辑上需要多条语句,应该用到块。 5.3 while (val <= 10) sum += val,++val; //可读性降低 5.4 (a) 非法,iter...
2019-10-14 10:49:04
503
原创 C++ Primer(第五版)4.9--4.11.3节练习
4.28 #include <iostream> using namespace std; int main() { cout << "char: " << sizeof(char) << endl; cout << "short: " << sizeof(short) << endl; co...
2019-10-12 11:00:17
351
原创 C++ Primer(第五版) 4.5--4.8节练习
4.17 前置版本:先将运算对象加1,将改变后的对象作为求值结果;后置版本:将运算对象加1,但求值结果是运算对象改变之前的那个值的副本。 4.18 使用前置,pbeg先加1,再解引用,无法输出第一个元素,而且最后会越界。 4.19 (a)先判定ptr是否有效,有效则判定ptr指向的值是否为0,并递增ptr; (b)先判定ival是否为0,非0则继续检查(...
2019-10-11 11:29:45
317
原创 C++ Primer(第五版) 4.1.2--4.4节练习
4.1 105 4.2 (a) *(vec.begin())shiyong (b) (*(vec.begin())) + 1 4.3 两个准则可以避免缺陷: 1. 不确定求值顺序时使用括号; 2. 如果改变了某个对象的值,在表达式其他地方不要再使用这个对象,例外:改变运算对象的子表达式本身是另外一个...
2019-10-10 11:08:32
310
原创 C++ Primer(第五版) 3.5.4--3.6节练习
3.37 输出结果是hello,每个字符占一行。 3.38 指针的值只是所指对象的内存地址,将两个地址值相加没有意义。 3.39 #include <iostream> #include <cstring> #include <string> using namespace std; int main() { string s1...
2019-10-09 11:25:36
496
原创 C++ Primer(第五版) 3.5.1--3.5.3节练习
3.27 (a)非法,buf_size不是常量表达式; (b)合法; (c)非法,只有当txt_size()是constexpr的才合法; (d)非法,字符串以'\0'结尾,数组长度不够。 3.28 string都被初始化为空串;ia元素值为0;ia2元素值未定义。 3.29 数组大小是固定的,不能随意增加元素...
2019-10-08 16:12:54
562
原创 C++ Primer(第五版) 3.4.2节练习
3.24 #include <iostream> #include <vector> using namespace std; int main() { vector<int> ivec; int i; while (cin >> i) { ivec.push_back(i); } for (auto it = ive...
2019-10-08 14:54:22
334
原创 C++ Primer(第五版)3.3.1--3.4.1节练习
3.12 (a)正确;(b)错误,元素类型不匹配;(c)正确。 3.13 (a)元素数量0;(b)元素数量10,每个都为0;(c)元素数量10,每个都为42;(d)元素数量1,值为10; (e)元素数量2,值为10和42;(f)元素数量10,都为空串;(g)元素数量10,每个字符串都为"hi"。 3.14 #include <iostream...
2019-09-30 17:55:08
446
原创 C++ Primer(第五版)3.1--3.2.3节练习
3.1 using声明形式:using namespace::name,例如:using std::cin; using std::cout; 等。头文件代码一般不应适用using声明。 3.2 #include <iostream> #include <string> using namespace std; int main() { //读一行 ...
2019-09-30 11:06:56
313
原创 C++ Primer(第五版) 2.6.1--2.6.3节练习
2.39 类定义的最后要加上分号。 2.40 struct Sales_data { string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; 2.41 见2.42题 2.42 Sales_data.h头文件 #ifndef SALES_DATA_H #defin...
2019-09-29 15:40:00
562
1
原创 C++ Primer(第五版) 2.4--2.5.3节练习
2.26 (a)错误,const对象必须初始化; (d)错误,const对象的值不能再改变。 2.27 (a)错误,非常量引用不能绑定到字面值; (b)合法; (c)合法,常量引用可以绑定字面值; (d)合法,p3指向的值和自身都不能改变; (e)合法; ...
2019-09-29 10:30:43
593
1
原创 C++ Primer(第五版) 2.2.1--2.3.3节练习
2.1 int, long, long long, short都是整型,区别是最小尺寸不同,int和short为16位, long为32位,long long为64位。float和double都是浮点类型,float最小尺寸为6位有效数字,double为10位。 2.2 都应该选择double类型。 2.3 结果分别为:32, 4294967264, 32, -32, 0, ...
2019-09-28 11:14:18
969
1
原创 C++ Primer(第五版)1.5.1--1.6节练习
1.20 #include <iostream> using namespace std; int main() { Sales_data record; while (cin >> record) cout << record << endl; return 0; } 1.21 #include <io...
2019-09-25 14:44:34
267
原创 C++ Primer(第五版)1.1--1.4.4节练习
1.1 linux环境,编译命令举例:g++ -o main main.cc 执行:./main 1.2 程序返回-1,linux环境使用 echo $? 命令可以看到返回255(-1)。 1.3 #include <iostream> using namesapce std; int main() { cout <<...
2019-09-25 10:09:57
247
原创 C++ Primer(第五版) 19.5--19.8.3节练习
19.20 将QueryResult类嵌套在TextQuery中: class TextQuery { public: using line_no = vector<string>::size_type; class QueryResult; TextQuery(ifstream&); QueryResult query(const string&) ...
2019-09-23 15:25:39
250
原创 C++ Primer(第五版) 19.4.1--19.4.3节练习
19.11 指向数据成员的指针与普通数据指针的区别:不仅要给出成员本身的类型,还需要给出所属类的类型。 19.12 //定义成员指针,指向Screen类的cursor成员 Screen::pos Screen::*pm = &Screen::cursor; //使用该指针获得Screen::cursor的值 Screen myscreen; auto val = mys...
2019-09-19 09:49:48
290
原创 C++ Primer(第五版) 19.3.1--19.2.4节练习
19.1 见练习19.2中new和delete两个函数的实现。 19.2 StrVec类中添加声明: class StrVec { public: ... void *operator new(size_t); void operator delete(void *mem) noexcept; }; new和delete函数实现: v...
2019-09-17 10:56:24
506
原创 C++ Primer(第五版) 18.3.1--18.3.5节练习
18.21 (b)错误,在一个派生列表中,同一个基类只能出现一次。 18.22 构造函数执行顺序:A, B, C, X, Y, Z, MI 18.23 4个转换都是允许的。 18.24 pb->print(); //调用Panda::print() pb->cuddle(); //ZooAnimal中没有cuddle(...
2019-09-10 18:00:11
385
原创 C++ Primer(第五版) 18.2.3--18.2.4节练习
18.18 当mem1是string类型,编译器要在常规作用域查找匹配的swap,还会在string所属的命名空间中查找是否有string类型特定版本的swap,最终使用std::swap交换;当mem1是int,为内置类型,没有特定版本的swap,最终调用std::swap。 18.19 会直接使用std::swap,不会再查找特定版本的swap及常规作用域中的其他swap。 1...
2019-09-06 17:19:29
352
1
原创 C++ Primer(第五版) 18.2.1--18.2.2节练习
18.12 程序框架: //QueryResult.h namespace chapter10 { string make_plural(size_t, const string &, const string &); ostream &print(ostream &, const QueryResult &); class...
2019-09-06 16:46:20
355
原创 C++ Primer(第五版) 18.1.4--18.1.5节练习
18.8 使用noexcept说明可以指定某个函数不会抛出异常。 18.9 异常类: class out_of_stock: public runtime_error { public: explicit out_of_stock(const string &s): runtime_error(s) { } }; class isbn_mismatch: ...
2019-09-05 15:14:21
276
原创 C++ Primer(第五版) 18.1.1--18.1.3节练习
18.1 (a) range_error; (b)exception 18.2 使用new动态分配的内存没能释放。 18.3 方法1:将可能发生异常的操作放在try语句块中: try { ifstream in("ints"); // 异常 } catch { delete p; } 方法2:定义一个类进行封装,管理数组...
2019-09-04 16:42:16
346
原创 C++ Primer(第五版) 17.5.1--17.5.3节练习
17.34 只使用了不同进制的操作符 #include <iostream> using namespace std; int main() { cout << showbase; cout << 20 << " " << 1024 << endl; cout << oct << 2...
2019-08-28 15:44:54
234
原创 C++ Primer(第五版) 17.4.1--17.4.2节练习
17.28 #include <iostream> #include <random> using namespace std; unsigned random_val() { static default_random_engine e; static uniform_int_distribution<unsigned> u(0,100);...
2019-08-27 16:03:20
221
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅