努比亚一面

今天早上进行了努比亚一面;
我面试的工作是软件开发工程师,但是不知道为什么给我面试的好像是一个做嵌入式的,偏硬件的面试官,面试的时候就觉得不是很对口,问得好多答不上来,但是面试官人还是很好的,不会的帮我讲解了讲解,受教了一番,学习到了不曾注意的地方。
1.fork怎么用;
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
int main()
{
for(int i = 0; i<2;i++)
{
fork();
printf("+");
}
wait();
wait();
return 0;
}
+ 打印了几次?
对于fork()的理解,按理来说应该是打印6个,但是这个程序很tricky的输出8个。
首先回顾下fork()的系统调用特性:
(1)fork()系统调用是unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
(2)还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样的复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
所以上面的成为什么会输入8个“+”,是因为printf("+");语句中有buffer,所以,对于上述程序,printf("+");把“+”放到了缓存中,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
修改:
将printf("+");改为printf("+\n");
或者
printf("+");
fflush(“stdout”);
因为程序遇到“\n”,或是EOF,或是缓中区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。
链接:https://blog.csdn.net/huai1693838234/article/details/48240099

2.用C语言来实现面向对象中的类,你该怎么实现?
C语言没有类,但可以采用struct去充当一个类,与类Class不同的是,结构体只能去定义变量,不能定义函数,可以通过函数指针的方式来实现。
typedef struct Person{
char name;
int age;
void (*EatFunction)(struct Person this, int num);
}Person;
void EatFuntion(struct Person this, int num)
{
printf(“Test\n”);
}
3.C语言中用malloc来开辟空间,那么如果开辟1G的空间,内存就会给你1G吗?
开辟好空间后,会反馈给你已经开辟好了空间,但是如果你没有使用那么就先不给你,等你使用后才会将1G的内存空间给你。
4.你会看电子图吧?
本人不会,
你是电子与通信工程专业的的为什么不会这个,我虽是这个专业的,但是方向确实数字信号处理,并且是软件方向,所以不了解这个。
5.那你玩过单片机吗?学过数电模电吗?
那都是本科的时候的事情了。。。
6.那你有什么想问我的么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值