面试复盘一(回答不好的地方做总结)

创作人QQ:851301776,邮箱:[email protected],欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习

问题1、 source filename 与 sh filename 及./filename执行脚本的区别?

  • 当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
  • sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
  • source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

问题2:C++中纯虚函数和虚函数的区别? 

  • 纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
  • 虚函数声明如下:virtual ReturnType FunctionName(Parameter); 虚函数必须实现,如果不实现,编译器将报错,错误提示为:
    error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"
  • 对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。
  • 实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。
  • 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
  • 在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。
  • 友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。
  • 析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。

问题3:线程的私有空间?(这个问题会涉及到线程间的数据传递)

 转载:线程私有存储空间--pthread_key_t_birate_小小人生的博客-CSDN博客_线程私有空间

一个进程中线程直接除了线程自己的栈和寄存器之外,其他几乎都是共享的,如果线程想维护一个只属于线程自己的全局变量怎么办?线程的私有存储解决了这个问题。
下面说一下线程存储的具体用法。

创建一个类型为 pthread_key_t 类型的变量。
调用 pthread_key_create() 来创建该变量。该函数有两个参数,第一个参数就是上面声明的 pthread_key_t 变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用。该函数指针可以设成 NULL ,这样系统将调用默认的清理函数。
当线程中需要存储特殊值的时候,可以调用 pthread_setspecific() 。该函数有两个参数,第一个为前面声明的 pthread_key_t 变量,第二个为 void* 变量,这样你可以存储任何类型的值。
如果需要取出所存储的值,调用 pthread_getspecific() 。该函数的参数为前面提到的 pthread_key_t 变量,该函数返回 void * 类型的值。



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <pthread.h>


#define PTHREAD_COUNT		2

pthread_key_t key;
typedef void* (*thread_cb)(void*);

struct pair {
	int x;
	int y;
};

void *thread1_proc(void *arg) {

	struct pair p = {1, 2};
	int i = 0;
	
	while (++i < 100) {
		p.x ++;
		p.y ++;
		pthread_setspecific(key, &p);
		
		struct pair *res = (struct pair *)pthread_getspecific(key);
		printf("x: %d, y: %d\n", res->x, res->y);
	}
}

void *thread2_proc(void *arg) {

	int i = 0;

	while (++i < 100) {
		pthread_setspecific(key, &i);

		int *res = (int *)pthread_getspecific(key);
		printf("res: %d\n", *res);
	}
	
}

void *thread3_proc(void *arg) {

	
	int i = 0;
	
	while (++i < 100) {
		
		struct pair *res = (struct pair *)pthread_getspecific(key);
		printf("x: %d, y: %d\n", res->x, res->y);
	}
}


int main(int argc, char *argv[]) {

	pthread_key_create(&key, NULL);

	pthread_t thread_id[PTHREAD_COUNT] = {0};
	thread_cb thread_proc[PTHREAD_COUNT] = {
		thread1_proc,
		thread2_proc
	}; 
	
	int i = 0;
	for (i = 0;i < PTHREAD_COUNT;i ++) {
		pthread_create(&thread_id[i], NULL, thread_proc[i], NULL);
	}
	
	for (i = 0;i < PTHREAD_COUNT;i ++) {
		pthread_join(thread_id[i], NULL);
	}

	pthread_key_delete(key);
}

 问题4:多个线程同时调用一个函数,次函数会访问一个全局变量?

此问题为函数重入问题

函数重入、函数重载、函数重写自己理解_QQ851301776的博客-CSDN博客

问题5:一个.c文件中写了一个函数,然后多个进程调用?

问:能不能调用,我当时回答的是可以,因为我想到了,进程间的栈空间是独立的。因为我使用过多个进程调用同一个库。

问题6:通过脚本,如果获固定文件夹中的最新文件?然后拷贝到固定目录?说一下指令。

首先这个问题本身具有歧义点:在最新
最晚创建的还是最后修改的叫最新文件?

我回答的思路是:

  • 获取文件的元数据,判断最近修改或者最近创建的文件和上一个文件的判断(不知道)。
  • 然后拷贝到固定目录(cp)

后来查询网上的指令为(stat)

问题7:问题软连接和硬链接的问题?

 转载:linux硬链接与软链接 - crazyYong - 博客园

1.硬连接

创建方式:ln (已经存在的文件) (硬链接名称)

说明:

        (1)不允许给目录创建硬链接

        (2)不可以在不同文件系统的文件间建立链接

        (3)windows和Linux共享目录中不能做硬链接

解释说明(ln xx.txt xx1):

        (1)硬连接,相当与一个指针,比如xx.txt, xx.txt就是这个文档的硬连接,而xx.txt这个文件名不属于文件内容。 操作:ln xx.txt xx1.   xx1就是xx.txt的硬连接。 我们虽然能看到目录下有xx1文件,但是其实xx1就相当与一个指针,和xx.txt指向同一个文件。

       (2)文件修改:如果我们执行(echo 123 > xx1),我们可以查看到xx.txt的内容也发生了改变。

       (3)删除,hardetest.txt为新建的文件,hardetest1和hardetest2为硬连接。

mrlee@mrlee-virtual-machine:~/test$ cat hardetest.txt 
abcdefg
mrlee@mrlee-virtual-machine:~/test$ cat hardetest1 
abcdefg
mrlee@mrlee-virtual-machine:~/test$ cat hardetest2
abcdefg
mrlee@mrlee-virtual-machine:~/test$ rm hardetest.txt 
mrlee@mrlee-virtual-machine:~/test$ cat hardetest1
abcdefg
mrlee@mrlee-virtual-machine:~/test$ cat hardetest2
abcdefg
mrlee@mrlee-virtual-machine:~/test$ ll hardetest2 
-rw-rw-r-- 2 mrlee mrlee 8 7月  11 09:43 hardetest2
mrlee@mrlee-virtual-machine:~/test$ 

 删除文件,只是删除了文件名,硬连接数目减1,当硬连接数目等于0的时候,文件被删除。

2.软连接

操作:ln -s (源文件) (软连接名称)

软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

3.软硬连接的区别

  •  硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
  • 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
  • 链接数目是不一样的,软链接的链接数目不会增加;
  • 文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B。因为BBB共有3个字符
  • 软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接

总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

mrlee@mrlee-virtual-machine:~/test$ stat software2
  文件:'software2' -> 'software.txt'
  大小:12        	块:0          IO 块:4096   符号链接
设备:801h/2049d	Inode:5256149     硬链接:1
权限:(0777/lrwxrwxrwx)  Uid:( 1000/   mrlee)   Gid:( 1000/   mrlee)
最近访问:2022-07-11 10:04:35.843633733 +0800
最近更改:2022-07-11 10:04:28.299633376 +0800
最近改动:2022-07-11 10:04:28.299633376 +0800
创建时间:-
mrlee@mrlee-virtual-machine:~/test$ stat software.txt 
  文件:'software.txt'
  大小:9         	块:8          IO 块:4096   普通文件
设备:801h/2049d	Inode:5256594     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/   mrlee)   Gid:( 1000/   mrlee)
最近访问:2022-07-11 10:03:48.211631478 +0800
最近更改:2022-07-11 10:03:05.299629446 +0800
最近改动:2022-07-11 10:03:05.299629446 +0800
创建时间:-
mrlee@mrlee-virtual-machine:~/test$ stat software1
  文件:'software1' -> 'software.txt'
  大小:12        	块:0          IO 块:4096   符号链接
设备:801h/2049d	Inode:5260779     硬链接:1
权限:(0777/lrwxrwxrwx)  Uid:( 1000/   mrlee)   Gid:( 1000/   mrlee)
最近访问:2022-07-11 10:03:16.255629965 +0800
最近更改:2022-07-11 10:03:14.603629887 +0800
最近改动:2022-07-11 10:03:14.603629887 +0800
创建时间:-

mrlee@mrlee-virtual-machine:~/test$ ll software1
lrwxrwxrwx 1 mrlee mrlee 12 7月  11 10:03 software1 -> software.txt
mrlee@mrlee-virtual-machine:~/test$ 

当然软链接也有硬链接没有的缺点:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

失败不重要,重要的是把不会的学会,下次问到了回答满分。

猜你喜欢

转载自blog.csdn.net/weixin_43155199/article/details/125712434
今日推荐