自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(125)
  • 收藏
  • 关注

原创 Linux网络驱动示例之snull网络接口(三):测试验证

1. 编译得到.ko文件后用insmod snull.ko添加模块;2. 在/etc/networks中添加网络号: snullnet0 192.168.0.0 snullnet1 192.168.1.03. 在/etc/hosts中添加主机IP号:192.168.0.1 local0192.168.0.2 remote0192.168.1...

2020-01-07 17:06:40 470

原创 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 677

原创 Linux网络驱动示例之snull网络接口(一):总体框架

《Linux设备驱动程序》(第三版)第十七章以snull网络接口为例讲解了网络驱动程序的设计,本文分析了snull这个示例,并对驱动程序做了一些简化和修改,只保留该程序的核心功能,并在2.6.31版本的内核上测试运行。1. 入口和出口函数 Linux网络设备驱动基本是围绕net_device这个结构做文章,程序的入口函数中主要是分配并注册net_device结构体,对...

2020-01-06 16:33:00 1412 1

原创 Linux设备驱动并发控制的简单总结

设备驱动中并发控制的常用机制:中断屏蔽,原子操作,自旋锁,互斥量。1. 中断屏蔽: Linux的进程调度都使用中断实现,屏蔽中断也就屏蔽了内核抢占引起的并发问题,但是中断屏蔽只针对本CPU,不能解决多 个CPU引起的竞争。 local_irq_disable(); //屏蔽中断 local_irq_enable(); //开中断...

2019-11-12 13:05:20 134

原创 C++ Primer(第五版) 7.4--7.6节练习

7.33 pos位于类的作用域之外,无法直接使用,应改为Screen::pos。7.34 放在最后一行无法通过编译,声明中使用的名字,包括返回类型和参数列表使用的名字,都必须在使用前确保可见。7.35 typedef string Type;Type iniVal(); //Type为stringclass Exercise {public: t...

2019-10-25 12:56:53 628

原创 C++ Primer(第五版) 7.3.1--7.3.4节练习

7.23 #ifndef SCREEN_H#define SCREEN_Hclass 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 509

原创 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 290

原创 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 319

原创 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 368

原创 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 268

原创 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 262

原创 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 448

原创 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 445 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 286

原创 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 305

原创 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 199

原创 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 367

原创 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 249

原创 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 210

原创 C++ Primer(第五版) 4.1.2--4.4节练习

4.1 1054.2 (a) *(vec.begin())shiyong (b) (*(vec.begin())) + 14.3 两个准则可以避免缺陷: 1. 不确定求值顺序时使用括号; 2. 如果改变了某个对象的值,在表达式其他地方不要再使用这个对象,例外:改变运算对象的子表达式本身是另外一个...

2019-10-10 11:08:32 234

原创 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 398

原创 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 422

原创 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 243

原创 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 346

原创 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 213

原创 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 401 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 461 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 800 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 168

原创 C++ Primer(第五版)1.1--1.4.4节练习

1.1 linux环境,编译命令举例:g++ -o main main.cc 执行:./main1.2 程序返回-1,linux环境使用 echo $? 命令可以看到返回255(-1)。1.3 #include <iostream>using namesapce std;int main(){ cout <&lt...

2019-09-25 10:09:57 162

原创 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 179

原创 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 197

原创 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 327

原创 C++ Primer(第五版) 18.3.1--18.3.5节练习

18.21 (b)错误,在一个派生列表中,同一个基类只能出现一次。18.22 构造函数执行顺序:A, B, C, X, Y, Z, MI18.23 4个转换都是允许的。18.24 pb->print(); //调用Panda::print() pb->cuddle(); //ZooAnimal中没有cuddle(...

2019-09-10 18:00:11 279

原创 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 256 1

原创 C++ Primer(第五版) 18.2.1--18.2.2节练习

18.12 程序框架://QueryResult.hnamespace chapter10 { string make_plural(size_t, const string &, const string &); ostream &print(ostream &, const QueryResult &); class...

2019-09-06 16:46:20 251

原创 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 179

原创 C++ Primer(第五版) 18.1.1--18.1.3节练习

18.1 (a) range_error; (b)exception18.2 使用new动态分配的内存没能释放。18.3 方法1:将可能发生异常的操作放在try语句块中:try { ifstream in("ints"); // 异常}catch { delete p;} 方法2:定义一个类进行封装,管理数组...

2019-09-04 16:42:16 251

原创 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 173

原创 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 148

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除