系统中采用jiffies来计算时间,但由于jiffies溢出可能造成时间比较的错误,因而强烈建议在编码中使用 time_after等宏来比较时间先后关系,这些宏可以放心使用。
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf 、fopen
、fread 、fwrite都在此列,他们也被称作缓冲I/O。其特征是对应每一个打开的文
件,都存在一个缓冲区, 在内存中都有一片缓冲区,每次读文件会多读若干条记录,
这样下次读文件时就可以直接从内存的缓存中取出,每次写文件时也仅仅是写入到内存的缓冲区,等待满足一定的条件(达到一定的数量,或者遇到特定字符,如换行和文件结束符EOF),再将缓冲区的内容一次性的写入文件,这样就大大增加了文件读
写的速度,减少了系统调用,但也为我们编程带来了一点点麻烦,如果有些数据,我们
认为已经写入了文件,实际上因为没有满足特定的条件,他们还只是保存在缓冲区内
,这时我们用_exit函数直接将程序关闭,缓冲区中的数据就会丢失,反之,如果向保证数据的完整性,就一定要使用exit函数。
int main()
{ printf("this is a test function!!!/n")
printf("test exit ");
exit(0);
}
int main()
{ printf("this is a test function!!!/n")
printf("test exit");
_exit(0);
}
这两个程序,程序1输出的是两句话,而程序2只输出了一句话。原因就是因为最后一
句话上没有加上特殊的字符,如换行和文件结束符,因为这个时候文件是存放在缓冲
区的,这个例子中文件就是存放打开的显示设备的缓冲区中的,因为输出函数要写入
,首先要进行系统调用,这个时候系统会打开显示设备的缓冲区,而exit的作用就是
结束,清理,就是说先检查缓冲区,把没有写入的数据写入到文件,而_exit是立刻
关闭文件,文件缓冲区的内容也就消失了,这个时候就不可能再输出到显示设备了。
那为啥Linux里要有进程组呢?其实,提供进程组就是为了方便对进程进行管理。假
设要完成一个任务,需要同时并发100个进程。当用户处于某种原因要终止这个任务时,要是没有进程组,就需要手动的一个个去杀死这100个进程,并且必须要严格按
照进程间父子兄弟关系顺序,否则会扰乱进程树。有了进程组,就可以将这100个进
程设置为一个进程组,它们共有1个组号(pgrp),并且有选取一个进程作为组长(
通常是“辈分”最高的那个,通常该进程的ID也就作为进程组的ID)。现在就可以通
过杀死整个进程组,来关闭这100个进程,并且是严格有序的。
进程必定属于一个进程组,也只能属于一个进程组。 一个进程组中可以包含多个进程
。 进程组的生命周期从被创建开始,到其内所有进程终止或离开该组。
会话:
一个或多个进程组的集合
开始于用户登录
终止与用户退出
此期间所有进程都属于这个会话期
再看下会话。由于Linux是多用户多任务的分时系统,所以必须要支持多个用户同时
使用一个操作系统。当一个用户登录一次系统就形成一次会话。每个会话都有一个会
话首领(leader),即创建会话的进程。一个会话可包含多个进程组,但只能有一个
前台进程组。
sys_setsid()调用能创建一个会话。必须注意的是,只有当前进程不是进程组的组长
时,才能创建一个新的会话。调用setsid 之后,该进程成为新会话的leader。
6、套接字和文件描述符的区别
终于明白了,套接字描述和文件描述符在linux下是一样的,其实我就是想问当进程
有套接字描述符和打开的文件描述符是否都是在那个集里面。
7 什么事软中断
编程异常通常叫做软中断
软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。
中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或
完成软中断信号对应的功能
软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实
的中断,是程序运行时设备对它的中断。
1.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
2.软中断是由程序调用发生的,而硬中断是由外设引发的
3.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较
长时间
12 . 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这
些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号
类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
int a = 5, b = 7, c;
c = a+++b; 这段代码持行后a = 6, b = 7, c = 12。
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则
返回1
解答:
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf 、fopen
、fread 、fwrite都在此列,他们也被称作缓冲I/O。其特征是对应每一个打开的文
件,都存在一个缓冲区, 在内存中都有一片缓冲区,每次读文件会多读若干条记录,
这样下次读文件时就可以直接从内存的缓存中取出,每次写文件时也仅仅是写入到内存的缓冲区,等待满足一定的条件(达到一定的数量,或者遇到特定字符,如换行和文件结束符EOF),再将缓冲区的内容一次性的写入文件,这样就大大增加了文件读
写的速度,减少了系统调用,但也为我们编程带来了一点点麻烦,如果有些数据,我们
认为已经写入了文件,实际上因为没有满足特定的条件,他们还只是保存在缓冲区内
,这时我们用_exit函数直接将程序关闭,缓冲区中的数据就会丢失,反之,如果向保证数据的完整性,就一定要使用exit函数。
int main()
{ printf("this is a test function!!!/n")
printf("test exit ");
exit(0);
}
int main()
{ printf("this is a test function!!!/n")
printf("test exit");
_exit(0);
}
这两个程序,程序1输出的是两句话,而程序2只输出了一句话。原因就是因为最后一
句话上没有加上特殊的字符,如换行和文件结束符,因为这个时候文件是存放在缓冲
区的,这个例子中文件就是存放打开的显示设备的缓冲区中的,因为输出函数要写入
,首先要进行系统调用,这个时候系统会打开显示设备的缓冲区,而exit的作用就是
结束,清理,就是说先检查缓冲区,把没有写入的数据写入到文件,而_exit是立刻
关闭文件,文件缓冲区的内容也就消失了,这个时候就不可能再输出到显示设备了。
那为啥Linux里要有进程组呢?其实,提供进程组就是为了方便对进程进行管理。假
设要完成一个任务,需要同时并发100个进程。当用户处于某种原因要终止这个任务时,要是没有进程组,就需要手动的一个个去杀死这100个进程,并且必须要严格按
照进程间父子兄弟关系顺序,否则会扰乱进程树。有了进程组,就可以将这100个进
程设置为一个进程组,它们共有1个组号(pgrp),并且有选取一个进程作为组长(
通常是“辈分”最高的那个,通常该进程的ID也就作为进程组的ID)。现在就可以通
过杀死整个进程组,来关闭这100个进程,并且是严格有序的。
进程必定属于一个进程组,也只能属于一个进程组。 一个进程组中可以包含多个进程
。 进程组的生命周期从被创建开始,到其内所有进程终止或离开该组。
会话:
一个或多个进程组的集合
开始于用户登录
终止与用户退出
此期间所有进程都属于这个会话期
再看下会话。由于Linux是多用户多任务的分时系统,所以必须要支持多个用户同时
使用一个操作系统。当一个用户登录一次系统就形成一次会话。每个会话都有一个会
话首领(leader),即创建会话的进程。一个会话可包含多个进程组,但只能有一个
前台进程组。
sys_setsid()调用能创建一个会话。必须注意的是,只有当前进程不是进程组的组长
时,才能创建一个新的会话。调用setsid 之后,该进程成为新会话的leader。
6、套接字和文件描述符的区别
终于明白了,套接字描述和文件描述符在linux下是一样的,其实我就是想问当进程
有套接字描述符和打开的文件描述符是否都是在那个集里面。
7 什么事软中断
编程异常通常叫做软中断
软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。
中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或
完成软中断信号对应的功能
软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实
的中断,是程序运行时设备对它的中断。
1.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
2.软中断是由程序调用发生的,而硬中断是由外设引发的
3.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较
长时间
12 . 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这
些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号
类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
int a = 5, b = 7, c;
c = a+++b; 这段代码持行后a = 6, b = 7, c = 12。
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则
返回1
解答:
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
} }
ASSERT()是干什么用的?
答:ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行
ASSERT()
是干什么用的
答
:ASSERT()
是一个调试程序时经常使用的宏,
在程序运行时它计算括号内的表达式,
如果
表达式为
FALSE (0),
程序将报告错误,并终止执行