某公司笔试题——Linux fork()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jammg/article/details/51055867

直接来源代码:

#include <stdio.h>
#include <unistd.h>
#include <wait.h>

int main()
{
    for (int i = 0; i < 2; ++i)
    {
        fork();
        printf("K");
    }
    wait(NULL);
    return 0;
}
请问会输出多少个K?


进程关系如下图:

图.1 进程关系示意图

由上图,一看可以看到输出结果是6.

可是,少年,Too young,too simple啊。

fork一个进程会发生什么事?大多数人都知道会复制程序调用栈,环境变量等等,程序代码段当然不会复制了。

但是,遗漏了一个重要的东西,那就是缓冲区,缓冲区在fork的时候也要被复制一份!!!

那知道会发生什么了吧,上面程序是调用c标准输出函数输出k,也就是printf,而标准输出是基于行缓冲的;第一次调用fork的时候,父子进程的K并没有输出,而是在缓冲区里面。

如果是:

...
printf("K\n");
...
或者:

...
write(STDOUT_FILENO, "K", 1);
...
那么缓冲区就将被刷新,此时就是输出6个K.


因为输出缓冲区没被刷新,所以程序执行就像这样:

图.2 程序fork输出示意图


所以,针对这条题目,是输出8个K。


最后,感谢,学习了!

展开阅读全文

某公司试题~~~

07-07

第一部分(公共试题,其中1、2、3、4、5为必答,其他为任选)rn1、 存贮器a = 0x23,b=0x45,当以下三条8088指令执行后,试述a与b的内容为多少。(5%)rnrnxor a,b ;( a=a xor b)rnxor b,a ;( b=b xor a)rnxor a,b ;( a=a xor b)rnrn2、 述以下程式之输出结果 (5%):rnrnint fhello()rnrnprintf(“Hello\n”);rnreturn 0;rnrnint t2()rnrnprintf(“Test2\n”);rnreturn 0;rnrnint main()rnrnint (*f) () = fhello;rnint (*p[]) () = fhello,t2;rn(*f)();rnp[1]();rnp[0]();rnrnrn3、标准的C语言中,多使用include 包含头文件,请简单描述和”xxx.h”的区别。(5%)rnrnrnrn4、请将下题中的空补充完整(20%)rn/***********************************************************************************************rn本程序为六个整型变量ABCDEF输入整数,并按从大到小的顺序输出它们的名和值。例如某次ABCDEF的输入值为3/2/5/7/4/6,则程序输出为:D(7)F(6)C(5)E(4)A(3)B(2)rn***********************************************************************************************/rnrn#define N sizeof(stTable) / sizeof(stTable [0])rnrnint iA,iB,iC,iD,iE,iF;rnstructrnrn char vn; /*存入字符*/rn int* vp;rn tmp, stTable[6] = 0, &iA,rn 0, &iB,rn 0, &iC,rn 0, &iD,rn 0, &iE,rn 0, &iF;rnvoid main(void)rnrn int k, j, m;rnrn for (k = 0; k < N; k++)rn rn stTable[k].vn = (1) ; rn printf("Enter data for %c\n", stTable[k].vn);rn scanf("%d", (2) ); rn rnrn m = N - 1; /*采用冒泡法排序*/rn while (m > 0)rn rn /*! 比较至上轮循环的最后交换前 */rnrn for (k = j = 0; j < m; j++)rnif ( (3) ) rn rn tmp = stTable[j];rn stTable[j] = stTable[j + 1];rn stTable[j + 1] = tmp;rn (4) ; rnrnrn m = (5) ; /*! 本行不能填m-1及m-- */ rn rnrn for (k = 0; k < N; k++)rn printf("%c(%d)", (6) ,rn (7) );rn rn printf("\n");rnrnrnrn rnrn 论坛

(请教)两个某公司试题...

04-06

1.已知一个顺序文件A,格式如下: rn① REC-KEY 数字型8位 (前零补足) rn② REC-SUBKEY数字型2位 (前零补足) rn③ REC-NAME 文字型8位 (后空格补足) rn其中①②为主键,已按升序排列,每条数据以回车换行符结束.请做以下操作并对所有分支进行测试. rn从头至尾一行一行读文件,将①相同的每一组数据的第一条输出到文件B,并且将③为数字的数据输出到顺序文件C.在读之前,需要一个询问,读完之后,将A的输入数据行数,B、C的输出数据行数输出到顺序文件D. rn例:顺序文件 A rn0000000101AAAAAAAA rn0000000102AAAAAAAB rn0000000103AAAAAAAC rn000000010412345678 rn顺序文件 B rn0000000101AAAAAAAA rn顺序文件 C rn000000010412345678 rn顺序文件 D rnA的输入行数=4,不但输出行数=1,C的输出行数=1 rnrnrn2.一个年级有N个班,一个班有M个学生,统计学生5科成绩的平均成绩, rnA.打印每班平均成绩85分以上者的各科成绩和平均成绩, rnB.打印每班的班总平均成绩和各科平均成绩. rn10>N>2,60>M>5 rn输入文件格式 (用.txt不能用数据库文件)rn排成升序的顺序文件(班单位中无顺序)中有每个学生的成绩5科. rn学校CODE(10位数字)、学校名、年级(1,2,3)、班号(1,2,3,4...)、学号(6位数字)、姓名,语文、数学、物理、化学、生物 rn例: rn5101030027 第二十七中 11103456 张云山 100100100100099 rn5101030027 第二十七中 11103457 王武卿 100100100072100 rn....... rn5101040081 第八十一中 23103456 李斯林 088089077066099 rn....... rn.......rnrn由于小弟是新手.完全摸不着头绪..rn希望会做的高手简单的指点下该从哪里入手?.该怎样思考?. 论坛

某公司几道试题求解!

10-14

一、某密码表以文件的形式存储在硬盘上,文件名为:encrypt.txt,其内容为: rnabcdefghijklmnopqrstuvwxyz rnushecginpaywdqmlxbozrtfvjk rn其中第一行和第二行分别是原字符和加密后字符的对应,请使用任意一种语言(如PHP、PERL、C/C++、Java等)实现上述加密过程, rn如字符"a"替换成字符"u"等,具体的功能要求如下: rn ·从文件载入上述密码表。 rn ·对指定的文件实施加密,保存在新的文件中。 rn ·请考虑算法的复杂度和异常处理能力。 rnrn二、数据库设计题: rn 请设计一套图书馆借书管理系统的数据库表结构;可以记录基本的用户信息、图书信息、借还书信息;数据表的个数不超过6个; rn 请画表格描述表结构(需要说明每个字段的字段名、字段类型、字段含义描述); rnrn在数据库设计中应: rn1. 保证每个用户的唯一性; rn2. 保证每种图书的唯一性;每种图书对应不等本数的多本图书;保证每本图书的唯一性; rn3. 借书信息表中,应同时考虑借书行为与还书行为,考虑借书期限; rn4. 保证借书信息表与用户表、图书信息表之间的参照完整性; rn5. 限制每个用户最大可借书的本数 rn6. 若有新用户注册或新书入库,保证自动生成其唯一性标识 rn7. 为以下的一系列报表需求提供支持: rn (无特定说明,不需编写实现语句,而需在数据库设计中,保证这些报表可以用最多一条SQL语句实现) rn a) 日统计报表:当日借书本数、当日还书本数报表; rn b) 实时报表: rn i. 当前每种书的借出本数、可借本数; rn ii. 当前系统中所有超期图书、用户的列表及其超期天数 rn iii. 当前系统中所有用户借书的本数,分用户列出(包括没有借书行为的用户);请编写实现此需求的SQL语句: rnrn数据库应用: rn请撰写一系列的SQL语句,分别描述完整的借书行为与还书行为;并保证这一系列的SQL语句的执行完整性。 rnrn三、日志分析与统计 rn假设某访问日志文件的格式如下: rn2005-01-09 07:02:23 | 127.0.0.1 | c=2 t=4 rn2005-01-09 17:12:09 | 192.168.0.1 | c=1 t=5 rn即:每行为一条记录,记录的格式如下:"时间 | IP | c=? t=?",每天所有的访问都记录在一个文件里。 rn现要求统计如下内容: rn ·每个IP每天的访问次数; rn ·每个IP每小时的访问次数; rn请考虑统计程序如何实现,给出设计思路和关键算法(可使用伪代码)。可以考虑多种思路,并分析在什么情况(如数据量多少等) rn下应使用哪种思路。 rn 论坛

没有更多推荐了,返回首页