汽车网站页面,怎么做可以把网站图片保存下来吗,2023又要开始做核酸了,公司形象墙设计笔试至少3次见到这个题#xff0c;都是瞎编的#xff0c;今天群里有人问#xff0c;然后有人放出了这个地址#xff1a;http://coolshell.cn/articles/7965.html#xff0c;让我恍然大明白#xff0c;豁然好脾气。 感谢这位陈皓同学#xff08;名字很熟#xff0c;不记…笔试至少3次见到这个题都是瞎编的今天群里有人问然后有人放出了这个地址http://coolshell.cn/articles/7965.html让我恍然大明白豁然好脾气。 感谢这位陈皓同学名字很熟不记得什么地方见过好像某本书上看见过。下面全文转一下 ***************下面全是转的我是分隔线*************** 前两天有人问了个关于Unix的fork()系统调用的面试题这个题正好是我大约十年前找工作时某公司问我的一个题我觉得比较有趣写篇文章与大家分享一下。这个题是这样的 题目请问下面的程序一共输出多少个“-” 1 #include stdio.h 2 #include sys/types.h 3 #include unistd.h 4 int main(void) 5 {6 int i;7 for(i0; i2; i)8 {9 fork();
10 printf(-);
11 }
12 return 0;
13 } 如果你对fork()的机制比较熟悉的话这个题并不难输出应该是6个“-”但是实际上这个程序会很tricky地输出8个“-”。 要讲清这个题我们首先需要知道fork()系统调用的特性 fork()系统调用是Unix下以自身进程创建子进程的系统调用一次调用两次返回如果返回是0则是子进程如果返回值0则是父进程返回值是子进程的pid这是众为周知的。还有一个很重要的东西是在fork()的调用处整个父进程空间会原模原样地复制到子进程中包括指令变量值程序调用栈环境变量缓冲区等等。所以上面的那个程序为什么会输入8个“-”这是因为printf(“-”);语句有buffer所以对于上述程序printf(“-”);把“-”放到了缓存中并没有真正的输出参看《C语言的迷题》中的第一题在fork的时候缓存被复制到了子进程空间所以就多了两个就成了8个而不是6个。 另外多说一下我们知道Unix下的设备有“块设备”和“字符设备”的概念所谓块设备就是以一块一块的数据存取的设备字符设备是一次存取一个字符的设备。磁盘、内存都是块设备字符设备如键盘和串口。块设备一般都有缓存而字符设备一般都没有缓存。 对于上面的问题我们如果修改一下上面的printf的那条语句为 1 printf(-\n); 或是 1 printf(-);
2 fflush(stdout); 就没有问题了就是6个“-”了因为程序遇到“\n”或是EOF或是缓中区满或是文件描述符关闭或是主动flush或是程序退出就会把数据刷出缓冲区。需要注意的是标准输出是行缓冲所以遇到“\n”的时候会刷出缓冲区但对于磁盘这个块设备来说“\n”并不会引起缓冲区刷出的动作那是全缓冲你可以使用setvbuf来设置缓冲区大小或是用fflush刷缓存。 我估计有些朋友可能对于fork()还不是很了解那么我们把上面的程序改成下面这样 1 #include stdio.h 2 #include sys/types.h 3 #include unistd.h4 int main(void) 5 {6 int i;7 for(i0; i2; i)8 {9 fork(); //注意下面的printf有“\n”
10 printf(ppid%d, pid%d, i%d \n, getppid(), getpid(), i);
11 }
12 sleep(10); //让进程停留十秒这样我们可以用pstree查看一下进程树
13 return 0;
14 } 于是上面这段程序会输出下面的结果注编译出的可执行的程序名为fork ppid8858, pid8518, i0
ppid8858, pid8518, i1
ppid8518, pid8519, i0
ppid8518, pid8519, i1
ppid8518, pid8520, i1
ppid8519, pid8521, i1 $ pstree -p | grep fork |-bash(8858)--fork(8518)--fork(8519)---fork(8521) | | -fork(8520) 面对这样的图你可能还是看不懂没事我好事做到底画个图给你看看 注意上图中的我用了几个色彩相同颜色的是同一个进程。于是我们的pstree的图示就可以成为下面这个样子下图中的颜色与上图对应 这样对于printf(“-”);这个语句我们就可以很清楚的知道哪个子进程复制了父进程标准输出缓中区里的的内容而导致了多次输出了。如下图所示就是我阴影并双边框了那两个子进程 现在你明白了吧。另对于图中的我本人拙劣的配色请见谅! 全文完 转载本站文章请注明作者和出处 酷壳 – CoolShell.cn 请勿用于任何商业用途 ———————— 感谢 42qu.com 为本站提供 VPS ————————转载于:https://www.cnblogs.com/anpengapple/archive/2012/10/13/2722827.html