c++后端面试测试题解

2020新春愉快,大吉大利:

2020年开头,上家公司的技术研究部门裁撤。放假前一天告知,让转到IM部门。 对于区块链行业来说,技术是很有吸引力的,不过一个行业来说,必然经历概念、初期探路者、形成产品模型、各路牛鬼蛇神蜂拥而入,到一大片行业公司死掉,再到形成行业寡头。 目前区块链处于第四个阶段。 对于区块链行业来说,相关的监管层风险是比较大的。去年年底,有一大批公司出现风险而见诸报端。 于是决定,暂不涉及区块链行业,等待形势明朗。

那么一个问题就出现了。下一家公司如何找,找什么样子类型的工作。

本来年初是跳槽的旺季,今年不一样。 一些公司发来线上面试,也是第一次见到这种形式。 有些公司做的好,流程就科学。
也有个别公司,本身不具备面试被人的能力,因为有点钱,就也去面试别人了。 放眼天下,公司何其多,大家都是同胞,何必为难别人。
说件事情:2020.2.13上午有家做区块链的公司发来面试邀请,电话面试,问他要不要看文档或源码,回答说电话就行,在下也是虎躯一震,电话很多事情是说不清楚的,结果不出所料,面试效果不理想。有时候是电话信号不好,听不清晰。有时是都有事情,有时是牵强一个问题冒冒失失的就过来了。 不过技术的问题,终究可以找到相同点,人性的问题实难找到平衡,不然世界上那么多事情就没有了。 对方面试官,最经典的问题是,你做过存储,我没有做过不懂。本以为会下一个话题,不想对方还是没有忍住,说大文件io有什么好的方法。标准答案是:零拷贝技术、缓存。 然后对方装腔作势,问有没有其他答案,说没有。 对方就把线性写盘说了出来。于是反击开始:“对于分布式存储来说,写入的内容并非是格式化的,内容是千奇百怪,所以不存在线性写盘能提高Io性能这种说法。存储行业里面的做法是,用ssd存储热点文件,普通磁盘存储冷文件。对于短消息来说主要是mq和缓存,短消息不考虑磁盘性能” 本来这个问题到此就结束了,然后对方不服,突然来了一句说,“我说的是kafka,kafka就是磁盘性能……” 。 此时问题已经被偷换了,还在继续装。 我就说了一句:“注意你问问题的流程和持度”,等他换话题。不想,对方可能也是自己决定这边不太好沟通,于是一句话不说就挂断了电话。

这一行为很不礼貌。 于是作为程序员,一般来说是不会因为技术原因而服过别人的(如果是,那是遇到了大神)。
既然决定不去,也不用客气。直接指出了对方不礼貌,流程有误。 对方还在说kafka的事情,tm绕不过去了,于是继续怂。

如果都是这样的公司,不做程序与也罢,人们教师,医生护士,都是很好的职业。程序员好歹是半个知识分子吧(没事读读历史,关注社会事件,在支付宝上面捐捐款,虽然不能大富大贵,至少是活得有尊严有方向感),好在正常的公司还是比较多一些的,不至于换行业。
沟通是一个若人性的问题,少年年轻气盛,中年意气风发,中老年功成名就。三种人不同之处有二。不同阶段,面对事情的态度不一样、其次才是基类的社会资源不一样。
你面看到的别人的态度,多多少少是你自己态度的体现。 因为大家都是人,众生平等,包括今年武汉的特殊情况,你以为你是谁?(who you are thingking you about?)。

有人觉得自己牛逼,也有一些人颐指气使。那你离开地球去火星独闯天下如何? 嫌远的话,你下楼出去散散步? 真实的情况是,你依赖这个社会上面每一个不认识的人,而不是相反。 哪怕是陌生人,他对你都有你所不知道的影响,蝴蝶效应。 所以请保持善良,不必要就不要去做伤害别人的事情。 很多人学到了马云和任正非等人的牛逼,没有学到马云对人性的深刻理解。
学会了吹牛,没有学会做事。 学会了埋怨,没有学会欣赏。再者,马云这种大神,一两个就好。对觉得多数人来说,不需要再多你一个,你也比较难做到。

凡是开口闭口马云,任正非的,10个里面有8个是骗子。这个比例不算过分,在下以为是中肯的答案。

那么作为个人来说,在下是比较关注自己的事情,不会觉得别人不符合自己的意图,就开始强迫别人来怎么样。 此谓修身。
不过这种想法,在米国也许天经地义。在某个神奇的东方,可能并不是主流。
罗永浩说过一句话很准确。“不论任何级别,要么做孙子,要么做大爷,就是想做自己别人不让你做”,当然,这个是动态的,很多人是这边做了大爷,那边做了孙子。在大爷和孙子的角色之间来回自由切换,风生水起。 在下还是觉得,何必呢。 对自己的家人好,不负自己的亲朋友好友。 此谓齐家。
至于另外一个追求,指点江山,激扬文字,总想着自己开口让别人跪,这种事情不要去想(一些老板,一些公司的资治平庸但是又自命不凡的中低管理层)。 大家都各司其职,外无敌患,生活蒸蒸日上。 一个人能想清楚自己的事情,能照顾好家人就是很大的能力,其他事情不需要尔等额外挂念,否则就是损人不利己。

在这里插入图片描述

最后,在下送给各位一句话:

人一辈子,走走瞧瞧,吃吃喝喝,不生病,就是福气,如果能遇到自己爱的也爱自己的人,再发点小财,就是天大的福气。
T a n g s h u n c a i \color{#222514}{-}\color{#222514}{-}\color{#222514}{-}\color{#222514}{-}\color{#4285f4}{T}\color{#ea4335}{a}\color{#fbbc05}{n}\color{#4285f4}{g}\color{#34a853}{s}\color{#ea4335}{h}\color{#4285f4}{u}\color{#fbbc05}{n}\color{#34a853}{c}\color{#ea4335}{a}\color{#fbbc05}{i}

切入正题,下面是一家公司发来的面试题目

  • 1 编程,实现每5秒检查进程SchLdr是否运行正常,不正常请启动SchLdr?
#!/bin/bash

# 
function detect_process() {
	PROCESS=$1

	process_pid=`pidof $PROCESS`
	echo $process_pid

	if [ "x$process_pid" != "x" ];then
		return 0
	else
		return 1
	fi

}

sudo kill $(pidof SchLdr)

sleep 3s

while :
do
	if detect_process "SchLdr"
	then
		echo "process running";
	else
		echo "process start"
		`./SchLdr` &		
	fi
	sleep 5s
done
  • 2 Linux 命令杀掉进程NLdr,请使用awk或xarg方法;(写命令)
[root@izwz93atpalb56zydy9bpyz ~]# `ps -aux | grep NLdr | awk 'NR==1' | awk '{print "kill -9 " $2}'`
  • 3. 使用sed将文件tcpdump.sh中的tcpdump全部替换为wxDump;(写命令)
[root@izwz93atpalb56zydy9bpyz mianshi]# sed -i 's/tcpdump/wxDump/g'  tcpdump.sh
  • 4请写出redis基本类型的操作命令(List、Hash、String、Set),它与memcached的区别?
127.0.0.1:6379> set helloworld yes
OK
127.0.0.1:6379> get helloworld
"yes"
127.0.0.1:6379> quit
[root@izwz93atpalb56zydy9bpyz mianshi]#

链表:

[root@izwz93atpalb56zydy9bpyz mianshi]# redis-cli 
127.0.0.1:6379> lpush db leveldb
(integer) 1
127.0.0.1:6379> lpush db mysql
(integer) 2
127.0.0.1:6379> lpush db redis
(integer) 3
127.0.0.1:6379> lpush db salite3
(integer) 4
127.0.0.1:6379> lpush db memcached
(integer) 5
127.0.0.1:6379> lrange db 0 100
1) "memcached"
2) "salite3"
3) "redis"
4) "mysql"
5) "leveldb"
127.0.0.1:6379> 

哈希:

127.0.0.1:6379> hmset hash-test name boob sex man age 20 tel 13899019991
OK
127.0.0.1:6379> HMGET hash-test name sex age tel
1) "boob"
2) "man"
3) "20"
4) "13899019991"
127.0.0.1:6379> hdel hash-test age
(integer) 1
127.0.0.1:6379> HMGET hash-test name sex age tel
1) "boob"
2) "man"
3) (nil)
4) "13899019991"
127.0.0.1:6379>

字符串:

127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
127.0.0.1:6379

集合:

127.0.0.1:6379> sadd my-set 123 mysql shenzhen driver
(integer) 4
127.0.0.1:6379> scard my-set
(integer) 4
127.0.0.1:6379> smembers my-set
1) "driver"
2) "shenzhen"
3) "mysql"
4) "123"
127.0.0.1:6379> srem my-set mysql
(integer) 1
127.0.0.1:6379> smembers my-set
1) "driver"
2) "shenzhen"
3) "123"
127.0.0.1:6379>

redis与memcached都是用于缓存的组件。redis支持丰富的数据类型且支持数据持久化,memcached只是一个k-v映射。

  • 5. 请使用该map<int,list>mTest结构,实现增、删、查、改。(写代码)
#include <iostream>
#include <map>
#include <list>

using namespace std;

class Ctest {
	public:
		map<int,list<int>> mTest;

		Ctest() {
		}   
		~Ctest() {}

		void add(int key, int value) {
			auto List = mTest.find(key);
			if (List != mTest.end()) {
			//if (!List->second.empty()) {
				List->second.push_back(value);
				mTest.insert(make_pair(key, List->second));
			}
			else {
				mTest[key] = list<int>(1, value);
			}
		}

		void del(int key, int value) {
			//list<int> List = mTest[key];

			auto List = mTest.find(key);
			if (List == mTest.end()) {
				return;
			}

			List->second.remove_if([&](int n){ return n == value; });
		}

		bool find(int value) {
			for (auto & it : mTest) {
				for (auto & iter : it.second) {
					if (iter == value) {
						return true;
					}
				}
			}
			return false;
		}

		bool replace(int value, int new_val) {
			for (auto & it : mTest) {
				for (auto & iter : it.second) {
					if (iter == value) {
						iter = new_val;
						return true;
					}
				}
			}
			return false;
		}

		void show(void) {
			for (auto & it : mTest) {
				cout << "key=" << it.first << ", value[";
				for (auto & iter : it.second) {
					cout << iter << ", ";
				}
				cout << "]" << endl;
			}
		}
};

int main(int argc, char **argv)
{
	Ctest ct;

	cout << "add data to Ctest object" << endl;
	ct.add(1, 0);
	ct.add(1, 1);
	ct.add(1, 2);
	ct.add(5, 110);
	ct.add(1, 100);
	ct.add(2, 7);
	ct.add(1, 110);
	ct.show();
	cout << endl;

	cout << "0 " << (ct.find(0) ? "finded" : "not find") << endl;
	cout << "1 " << (ct.find(1) ? "finded" : "not find") << endl;
	cout << "2 " <<(ct.find(2) ? "finded" : "not find") << endl;
	cout << "30 " << (ct.find(30) ? "finded" : "not find") << endl;
	cout << "100 " <<(ct.find(100) ? "finded" : "not find") << endl;
	cout << endl;

	cout << "delete [1][2] [1][100]" << endl;
	ct.del(1, 2);
	ct.del(1, 110);
	ct.show();
	cout << "2" << (ct.find(2) ? "finded" : "not find") << endl;
	cout << "110" << (ct.find(110) ? "finded" : "not find") << endl;
	cout << endl;

	cout << "delete [5][110]" << endl;
	ct.del(5, 110);
	ct.show();
	cout << "110" << (ct.find(110) ? "finded" : "not find") << endl;
	cout << endl;

	cout << "replace first 100 whith 10001" << endl;	
	ct.add(1, 100);
	ct.add(1, 100);
	ct.replace(100, 10001);
	ct.show();

	return 0;
}

测试结果:

[root@izwz93atpalb56zydy9bpyz mianshi]# g++ main.cc -std=c++11
[root@izwz93atpalb56zydy9bpyz mianshi]# ./a.out 
add data to Ctest object
key=1, value[0, 1, 2, 100, 110, ]
key=2, value[7, ]
key=5, value[110, ]

0 finded
1 finded
2 finded
30 not find
100 finded

delete [1][2] [1][100]
key=1, value[0, 1, 100, ]
key=2, value[7, ]
key=5, value[110, ]
2not find
110finded

delete [5][110]
key=1, value[0, 1, 100, ]
key=2, value[7, ]
key=5, value[]
110not find

replace first 100 whith 10001
key=1, value[0, 1, 10001, 100, 100, ]
key=2, value[7, ]
key=5, value[]
[root@izwz93atpalb56zydy9bpyz mianshi]#
  • 6. 请使用该vectot<list>vTest结构,实现增、删、查、改。(写代码)

同上,略

  • 7重构代码

重构前:

//1
std::string content("[");

for (std::map<long, long>::const_iterator begin = tpMap.begin(); begin != tpMap.end(); ++begin) {
        snprintf(valueBuf, sizeof(valueBuf), "{\"Time\":\"%ld\",\"Count\":\"%ld\"},", begin->first, begin->second);
        content += valueBuf;
}
content += "]";


// 2
char * g_ResBuf = (char *) malloc ( 1024*1024*1);
memset(g_ResBuf,'\0',100*nSize+1024);

strcpy(g_ResBuf, "[");
for(TpsIter aIter = mapTps.begin();  aIter != mapTps.end(); aIter++) {
        sprintf(g_ResBuf+strlen(g_ResBuf), "{\"Time\":\"%ld\",\"Count\":\"%ld\"},", aIter->first, aIter->second);
}

重构后:

#include <string>
#include <map>
#include <sstream>

// 1
map<long, long> tpMap;
ostringstream con_stream;
//tpMap.insert(make_pair(121, 90));

con_stream << "[";
for (auto & it : tpMap) {
	con_stream << "{\"Time\":\"" << it.first << "\",\"Count\":\"" << it.second << "\"},";
}   
con_stream << "]";

std::string content(con_stream.str());
//cout << content << endl;



// 2
const uint64_t KB = 1024;
const uint64_t MB = 1024 * KB;
const uint64_t GB = 1024 * MB;
const uint64_t TB = 1024 * GB;
const uint64_t PB = 1024 * TB;
const uint64_t EB = 1024 * PB;

map<long, long> mapTps;
char *g_ResBuf = new char[MB];
g_ResBuf [0] = '\0';
int count = 0;

count += sprintf(&g_ResBuf[count], "[");
for (auto & it : tpMap) {
		count += sprintf(&g_ResBuf[count], "{\"Time\":\"%ld\",\"Count\":\"%ld\"},", it.first, it.second);
}
count += sprintf(&g_ResBuf[count], "]");

//delete []g_ResBuf;
  • 8编写shell脚本,每隔10秒监控进程Psr8583Q、Psr8583R、RPsr、QPsr,OriRptSumSvr,如果异常退出,重启进程。(写代码)
#!/bin/bash

# 
function detect_process() {
	PROCESS=$1
	#echo "detect $PROCESS"

	process_pid=`pidof $PROCESS`
	#echo "processpid="$process_pid

	if [ "x$process_pid" != "x" ];then
		return 0
	else
		return 1
	fi

}

process_tbl=("Psr8583Q" "Psr8583R" "RPsr" "QPsr" "OriRptSumSvr")
for process in ${process_tbl[@]}
do
	echo $process
	#sudo kill $(pidof $process)
done

sleep 3s


while :
do
	# var=`ps -aux | grep smart_release | grep root |awk '{printf $8}'`
	for process in ${process_tbl[@]}
	do
		if detect_process "$process"
		then
			#echo "process running"
			var=`ps -aux | grep $process| grep root |awk '{printf $8}'`
			status=`echo ${var:0:1}`
			var=`echo ${var:1}`
            		if [ "x${var}" = "x" ];then
				#break
				continue
			fi			

			case $status in
				Z )
				echo "EXIT_ZOMBIE"
				sudo kill $(pidof $process)
				sleep 3s
				echo "zombie process "$process" restart"
				`./$process` &
				break
				;;	

				X )
				sleep 2s
				echo "process "$process" restart"
				`./$process` &
				break
				;;
			esac
			
		else
			echo "now launch "$process
			`./$process` &
		fi
	done
	sleep 10s
done

  • 9 DB2,请创建存储过程,往testtab表中插入10万行数据。请问对数据库而言,什么时候在什么场景下使用存储过程?简述优缺点。(写代码)
mysql> use db2
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table emp(
    -> id int unsigned primary key auto_increment,
    -> empno mediumint unsigned not null default 0,
    -> ename varchar(20) not null default "",
    -> job varchar(9) not null default "",
    -> mgr mediumint unsigned not null default 0,
    -> hiredate date not null,
    -> sal decimal(7,2) not null,
    -> comn decimal(7,2) not null,
    -> deptno mediumint unsigned not null default 0
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> DELIMITER $$ 
mysql> CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
    -> BEGIN
    -> DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    -> DECLARE return_str VARCHAR(255) DEFAULT '';
    -> DECLARE i INT DEFAULT 0;
    -> WHILE i < n DO
    -> SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
    -> SET i = i+1;
    -> END WHILE;
    -> RETURN return_str;
    -> END $$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER $$ 
mysql> CREATE FUNCTION rand_num() RETURNS INT(5)
    -> BEGIN
    -> DECLARE i INT DEFAULT 0;
    -> SET i = FLOOR(100+RAND()*10);
    -> RETURN i;
    -> END $$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER $$
mysql> CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
    -> BEGIN
    -> DECLARE i INT DEFAULT 0;
    -> # set autocommit =0 把autocommit设置成0,把默认提交关闭
    -> SET autocommit = 0;
    -> REPEAT
    -> SET i = i + 1;
    -> INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comn,deptno) VALUES ((START+I),rand_string(6),'SALEMAN',0001,now(),2000,400,rand_num());
    -> UNTIL i = max_num
    -> END REPEAT;
    -> COMMIT;
    -> END $$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER $$
mysql> CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))
    -> BEGIN
    -> DECLARE i INT DEFAULT 0;
    -> SET autocommit = 0;
    -> REPEAT
    -> SET i = i+1;
    -> INSERT  INTO dept( deptno,dname,loc) VALUES((START+i),rand_string(10),rand_string(8));
    -> UNTIL i = max_num
    -> END REPEAT;
    -> COMMIT;
    -> END $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call insert_dept(10000,100000);
Query OK, 0 rows affected (7.17 sec)

mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| dept          |
| emp           |
+---------------+
2 rows in set (0.00 sec)

mysql> select count(*) from dept;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.02 sec)

mysql> desc dept;
+--------+-----------------------+------+-----+---------+----------------+
| Field  | Type                  | Null | Key | Default | Extra          |
+--------+-----------------------+------+-----+---------+----------------+
| id     | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
| deptno | mediumint(8) unsigned | NO   |     | 0       |                |
| dname  | varchar(20)           | NO   |     |         |                |
| loc    | varchar(13)           | NO   |     |         |                |
+--------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql>

对于性能要求高,业务复杂的功能需要使用存储过程。
优点是:可以实现精细准确的过程控制,可以根据数据表的特性经行定制化调优。
缺点是:学习成本高、可移植性差、业务代码复杂带来维护和开发的困难。

  • 10 在C++ STL,如何使用erase() 来删除map,set,vector 的所有数据?(写代码)
#include <iostream>
#include <map>
#include <set>
#include <vector>

using namespace std;

void map_erase(void)
{
	std::map<int, std::string> c = {{1, "one"}, {2, "two"}, {3, "three"},
		{4, "four"}, {5, "five"}, {6, "six"}};
	auto func = [&]()->void {
		for (auto &i : c) {
			std::cout << i.second << " ";
		}
	};
	cout << "before erase" << endl;
	func();

	auto size = c.size();
	cout << "size:" <<  size << endl;
	c.erase(c.begin(), c.end());
	cout << "after erase" << endl << endl;
	func();
}

void set_erase(void)
{
	std::set<int> c = {1, 2, 3, 4, 5, 6, 7, 8, 9};
	auto func = [&]()->void {
		for (auto &i : c) {
			std::cout << i << " ";
		}
	};
	cout << "before erase" << endl;
	func();
	
	auto size = c.size();
	cout << "size:" << size << endl;
	c.erase(c.begin(),  c.end());
	cout << "after erase" << endl << endl;
	func();
	
}

void vector_erase(void)
{
        std::vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
        auto func = [&]()->void {
                for (auto &i : c) {
                        std::cout << i << " ";
                }   
        };  
        cout << "before erase" << endl;
        func();
        std::cout << endl;

        auto size = c.size();
        for (auto i=0; i<size; i++) {
                c.erase(c.begin());
        }   
        cout << "after erase" << endl << endl;
        func();
}


int main(int argc, char ** argv)
{
	map_erase();	
	set_erase();
	vector_erase();

	return 0;
}

  • 11 . awk的求和、求平均、求最大值、求最小值。

求和

[root@izwz93atpalb56zydy9bpyz case2]# echo 10 | awk '{sum+=$1} END{print sum}'
10

求平均值

[root@izwz93atpalb56zydy9bpyz case2]# echo 10 33| awk '{sum=($1+$2)/2} END{print sum}'
21.5

求最大值

[root@izwz93atpalb56zydy9bpyz case2]# echo 10 33| awk '{if ($1>$2) print $1; else print $2}'
33
[root@izwz93atpalb56zydy9bpyz case2]# echo 33 10| awk '{if ($1>$2) print $1; else print $2}'
33
[root@izwz93atpalb56zydy9bpyz case2]#

求最小值

[root@izwz93atpalb56zydy9bpyz case2]# echo 10 33| awk '{if ($1<$2) print $1; else print $2}'
10
[root@izwz93atpalb56zydy9bpyz case2]# echo 33 10| awk '{if ($1<$2) print $1; else print $2}'
10
[root@izwz93atpalb56zydy9bpyz case2]#
  • 12 printf("%s/n",str) 内容是?
	#include <stdio.h>
	#include <string.h>			// add header file
	#include <stdlib.h>
	void getmemory(char *p)
	{
	 p=(char *) malloc(100);
	 strcpy(p,"hello world");
	}
	int main( )
	{
	 char *str=NULL;
	 getmemory(str);
	 printf("%s/n",str);		// '\n'
	 free(str);
	 return 0;
	}
[root@izwz93atpalb56zydy9bpyz case2]# g++ main.cpp 
[root@izwz93atpalb56zydy9bpyz case2]# ./a.out 
(null)/n[root@izwz93atpalb56zydy9bpyz case2]# 
[root@izwz93atpalb56zydy9bpyz case2]#
  • 13 写一个server程序需要注意哪些问题?

并发量、响应速度、错误处理、接口易用性、配置文件热加载、shell监控脚本(shell+curl+必要的话json)、cli、日志(一般用spdlog和log4)、可用性、出错处理、邮件报警、人性化的管理平台(python或vue架构)

  • 14 你对内存池、进程池、线程池的理解程度?

内存池是维护一块结构化的内存,这样可以节省内存申请和释放的开销,避免内存碎片化(碎片化的主要原因是数据格式不唯一);进程池适合业务独类的模块、线程池适合一个模块的多个子组件(如数据库,消息解析,消息处理),节省了进程/线程申请和释放的时间和资消耗,一般用reactor模型实现。

  • 15 请写出下列代码的输出内容
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
	char *p;		// nullptr !!!
	*p=-130;
	printf("%d",*p);		

	return 0;
}

[root@izwz93atpalb56zydy9bpyz case2]# vim main.cpp 
[root@izwz93atpalb56zydy9bpyz case2]# g++ main.cpp 
main.cpp: In function ‘int main(int, char**)’:
main.cpp:8:6: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘-130’ to ‘'~'[-Woverflow]
  *p=-130;
      ^~~
[root@izwz93atpalb56zydy9bpyz case2]# ./a.out 
Segmentation fault (core dumped)
[root@izwz93atpalb56zydy9bpyz case2]# rm core.4727 -f
[root@izwz93atpalb56zydy9bpyz case2]#
  • 16 交换和路由的区别?VLAN的特点?

交换技术和路由技术的主要区别在于他们寻址的方式以及报文的转发方式上,交换技术是发生在2层也就是数据链路层上,是直接利用mac地址建立会话;路由技术发生在网络层,需要通过ip地址建立路由表,然后进行数据通信。在报文的转发方式上,交换技术是使用先收再转,路由技术是采用边收边转。
vlan(虚拟局域网)的主要特点就是安全,信息只到达应该到达的地点。因此,防止了大部分基于网络监听的入侵手段。通过虚拟网设置的访问控制,使在虚拟网外的网络节点不能直接访问虚拟网内节点。

  • 17 触发器怎么工作的?

单条sql操作->触发->sqlN(预先设置好的语句),降低应用端与db的耦合度。

  • 18 Linux socket建立连接的主要实现步骤?

server : 设置监听ip:potr,创建套接字,监听,accept(),r/w
client: 设置目标ip:port,创建套接字,connect(),r/w

  • 19 连接库的两种方式? 如何编译动态库

静态库,动态库。在Cmakelist.txt中设置:
add_library(hello SHARED ${PROJECT_SOURCE_DIR}/libhello/hello.c)
install(TARGETS hello LIBRARY DESTINATION lib)

  • 20 已知一个数组table,用一个宏定义,求出数据的元素个数?
template<typename T, unsigned int N>
char (&array_size_fake_func(T(&)[N]))[N];

#define MYARRAYSIZE(A) sizeof(array_size_fake_func(A))
  • 21 ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
    应用层
    表示层
    会话层
    传输层
    网络层
    数据链路层
    物理层
    tcp/udp属于传输层。

tcp优点是稳定可靠,缺点是状态确认导致速度慢。
udp优点是数据传输速度快,缺点是包没有顺序,不可靠。

-22 Linux命令、定位文件temp.dat偏移量为22554的内容,并且使用16进制打印。

[root@izwz93atpalb56zydy9bpyz case2]# dd if=/dev/zero of=./temp.dat bz=1M count=1
dd: unrecognized operand ‘bz=1M’
Try 'dd --help' for more information.
[root@izwz93atpalb56zydy9bpyz case2]# dd if=/dev/zero of=./temp.dat bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00151546 s, 692 MB/s
[root@izwz93atpalb56zydy9bpyz case2]# dd if=./temp.dat skip=22554 of=/tmp/aaa bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000175876 s, 5.7 kB/s
[root@izwz93atpalb56zydy9bpyz case2]# hexdump /tmp/aaa 
0000000 0000                                   
0000001
[root@izwz93atpalb56zydy9bpyz case2]#

-23 请简述,如何解决工作中遇到一时难以解决的技术问题?

某知名搜索引擎、博客、github

发布了67 篇原创文章 · 获赞 66 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jacky128256/article/details/104281266