二面遗漏点梳理


​ 感觉自己答的普普通通,通过这次面试发现自己在基础上的不足。自己学习了一下当时有些迷糊的知识点,整理如下:

迷糊点1:

char str[] = “hello!” ;
char *p = str ;
请写出下面输出的结果
printf("%d\n",sizeof (str ) );
printf("%d\n",sizeof ( p );

对于sizeof(),在对数组名进行操作时,返回的大小为数组所占用的内存大小,而对指向数组的指针进行操作时,返回的大小为指针的大小(自己对指针返回的大小很犹豫,现在记住了,从这里也可以看出,数组名并不是完全等同于指针)

​ 关于上面的问题,自己学了数组名和指针的区别。(1)在本质上,数组名其实指代一种数据结构,这个数据结构就是数组的全体(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量!(3)和数组名不同,指向数组的指针则是另外一种变量类型,它用于存放数组的地址(4)如果数组名作函数行参时,在函数体内它就失去了本身的数据机构特性,仅仅只是一个指向改数组的指针

​ 而且通过这个问题,自己查找了一下有关sizeof,发现自己一直以为它是一个函数,而它实质上是一个操作符(从sizeof(int)上就可以看出,因为函数接纳的形参不能是一个int的类型数据)

下面是辨析的几个例子:

Test 1:
  char str[10];
  char *pStr = str;
  cout << sizeof(str) << endl;		//10(此时数组名表现为前面的性质(1))
  cout << sizeof(pStr) << endl;		//4(在32位系统下)

Test 2:
  char str1[10] = "hello";
  char str2[10];
  strcpy(str2,str1);		//此时数组名表现为前面的性质(2)
  
Test 3:
	void arrayTest(char str[])
	{
   		cout << sizeof(str) << endl;
	}
	char str1[10] = "hello";	
	arrayTest(str1);		//此时数组名表现为前面的性质(4)

迷糊点2

fork();printf("#");
fork();printf("#");

​ 当时自己回答的是6,结果电脑测出来是8。记得之前学到的子进程从fork()后开始执行,百思不得其解。。然后百度了一下,不得不说自己确实欠缺好多~

​ 从网上整理了一下思路,大概就是说这是由printf的缓冲机制 + 进程间的继承机制造成的。因为操作系统只是把printf的内容放到了stdout缓冲队列里,并没有实际写到屏幕上。而再运行到fork时,缓冲里面的内容被子进程继承了,所以最后这4个进程一共输出了8次

​ 但是只要系统看到\n就会立刻刷新stdout,或者我们用fflush()函数强制刷新缓冲区这两种方式,就会输出6个#

​ 具体辨析:

Test 1:
	fork();printf("#");			
	fflush(stdout);
	fork();printf("#");
	//输出6个
	
Test 2:
	fork();printf("#\n");
    fork();printf("#\n");
    //输出6行,每行1个

迷糊点3

​ 由于迷糊点2的题没有答好,面试官问到关于进程间的继承问题,自己找了一个经典题理解了一下:

pid_t pid1 = fork();
pid_t pid2 = fork();
printf("pid1:%d, pid2:%d\n", pid1, pid2);

​ 以前对于fork只停留在“新建一个进程,父进程返回一个子进程的pid,子进程返回一个0,然后系统就有两个进程,并开始向下执行内容”这个初步认识的阶段。

​ 其实fork的新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是它是一个全新的进程并作为原进程的子进程

​ 对于上面这个例子的有一下几个步骤:

(1)首先有一个主进程root,执行完第一个fork()创建一个进程son1,son1继承root的所有变量,环境变量,计数器等,然后更新pid1,假设此时root的pid1为1001,那么son1的pid1为0

(2)root执行完第二个fork()创建一个进程son2,son2继承root的所有变量,环境变量,计数器等,然后更新pid2,假设此时root的pid2为1002,那么son2的pid2为0,它们两个的pid1都为1001

(3)son1执行完第二个fork()创建一个进程grandson,grandson继承son1的所有变量,环境变量,计数器等,然后更新pid2,假设此时son1的pid2为1003,那么grandson的pid2为0,它们两个的pid1都为0

迷糊点4

​ 对于编程中常用的函数参数记忆不清。加强自己的记忆力吧,面试官问到listen()函数的第二个参是什么?当时给忘了,然后越想越着急,苦笑。。事后我说起这个第二个参,同学说不是最大连接数吗。。突然惊醒,感觉自己应该结合实际好好想想,其实这些东西也都不是死记硬背的。。

​ 最后,就是感觉到了自己的不足。自己学的东西好像是一个空中楼阁,经不起实战的打磨。继续沉下心来磨砺自己吧,把以后的重心先放在操作系统入门与系统编程上。凡事都要讲求一个透彻明白吧。。。。

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/88758840