免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5384 | 回复: 15
打印 上一主题 下一主题

问几个APUE的问题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-17 06:22 |只看该作者 |倒序浏览
本帖最后由 davidmalone 于 2011-08-19 01:55 编辑

1 fork调用后子进程拥有一个父进程缓冲区的副本,而vfork调用后,父子进程共享I/O缓冲区
这意思是 fork的话,子进程和父进程并不共享I/O缓冲区,子进程拷贝了父进程的副本而已
而vfork调用后,则共享?

2 标准库I/O相对于系统I/O, fgetc比指定I/O长度为1的read效率高是因为fgetc的实现相当于有一个具有最佳I/O长 n 的系统调用read预先读入了n个字节入流的缓冲区,然后再这个流缓冲区里一次读取一个字节,是这样理解吗

3关于session和作业的理解:APUE里说
一个对话期中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或几个后台进程组(background process group)。前台进程组接受终端输入信号。Shell中的作业控制就是对前后台进程组的控制,&或Ctrl+Z的进程组就是后台进程组。
如果一个对话期有一个控制终端,则它有一个前台进程组,其他进程组则为后台进程组。

对于不支持作业控制的Shell,例如bsh,它的命令和它自身的进程处于同一个会话和前台进程组。在后台执行的命令(&)和管道命令的进程依然和Shell是同一个进程组。


感觉这两句话前后矛盾啊
后台执行的命令(&)和管道命令的进程依然和Shell是同一个进程组。这意思是在后台执行的命令也属于前台进行组?





4 用sigprocmask设置 SIGQUIT 阻塞,然后调用sleep()函数
如果在sleep休眠期间产生了退出信号,那么此时信号是未决的,但是不再受阻塞
这句话如何理解,也就是信号阻塞除了用sigemptyset或者sigprocmask解除外,还能因为休眠期间收到信号而解除?
而且信号是pending的不受阻塞的,那么何时被递交给进程呢?

5 APUE里说如果新线程在主线程调用pthread_create返回之前就运行了
这意思是 pthread_create不是原子操作吗?

论坛徽章:
0
2 [报告]
发表于 2011-08-17 08:19 |只看该作者
本帖最后由 jiayanfu 于 2011-08-17 08:48 编辑

楼主很认真,我觉得值得我学习。
关于APUE我学的不多。
你说的第3个问题,应该是指“那个3表示的应该是常用的函数或函式库”。。。鸟哥的Linux私房菜上有讲过。。。
“1、表示使用者可以操作的命令或可执行文件”
“2、表示系统河西可以呼叫的函数与工具等”
“4、装置档案的说明”
“5、设定档或者是某些档案的格式”
“6、游戏”
“7、惯例与协议等、例如Linux标准系统档案、网络协议、ASCII code等等的说明内容”
“8、系统给管理用可用的管理指令”
“9、跟kernel有关的文件”
详见鸟哥的Linux基础文件第八章《开机关机、在线求助及指令下达方式》

论坛徽章:
0
3 [报告]
发表于 2011-08-17 08:23 |只看该作者
你的第6个问题,前后有矛盾吗?如果是的话,难道就不是原子操作了吗?原子操作的具体定义是什么?求解答。。

论坛徽章:
0
4 [报告]
发表于 2011-08-17 08:40 |只看该作者
你的第1个问题怎么了,这就是fork和vfork的区别啊,这怎么了。。。manual上这么说。。。
vfork()  differs  from fork() in that the parent is suspended until the
       child makes a call to execve(2) or _exit(2).  The child shares all mem-
       ory  with  its parent, including the stack, until execve() is issued by
       the child.  The child must not return from the current function or call
       exit(), but may call _exit().

论坛徽章:
0
5 [报告]
发表于 2011-08-17 08:49 |只看该作者
不过你说的第4个问题,alarm的作用是结束进程?  manual上alarm应该是发出报警信号SIGALARM吧?没说有结束进程的作用哟。。。。难道SIGALARM的默认行为是结束进程?{:2_171:}

论坛徽章:
0
6 [报告]
发表于 2011-08-17 08:51 |只看该作者
咦?你表错号了。。。出现了两个4.。。。囧。。。

论坛徽章:
0
7 [报告]
发表于 2011-08-17 09:07 |只看该作者
我觉得楼主说的第1个4,可以这么理解一下。。。
拿bash本身来说,说他是前台进程组,应该不会有意见吧。。。
APUE的意思是,你bash执行这些命令(包括管道啊后台执行啊等等)的进程和bash是一个进程组
这么说的说,还给予了“前台进程组”一个比较好的示例。。。。
要不楼主你举例说明一下前台进程组。。。

论坛徽章:
0
8 [报告]
发表于 2011-08-17 09:18 |只看该作者
关于第2个问题,我支持楼主的意见。。。有理!{:2_168:}

论坛徽章:
0
9 [报告]
发表于 2011-08-17 09:49 |只看该作者
关于楼主提到的第5个问题,楼主理解有误。那一小段,书上说的“sigprocmask”,是指第2此调用该函数的时候,不是楼主说的那意思。。。那时候信号阻塞正要被解除!楼主明鉴!
原文如此:
在睡眠期间如果产生了退出信号,那么此时该信号是未决的,但是不再受阻塞,所以在
s i g p r o c m a s k返回之前,它被递送到本进程。从程序的输出中可以看到这一点: S I G Q U I T处理
程序(s i g q u i t)中的p r i n t f语句先执行,然后再执行s i g p r o c m a s k之后的p r i n t f语句。

论坛徽章:
0
10 [报告]
发表于 2011-08-19 01:53 |只看该作者
关于楼主提到的第5个问题,楼主理解有误。那一小段,书上说的“sigprocmask”,是指第2此调用该函数的时候,不是楼主说的那意思。。。那时候信号阻塞正要被解除!楼主明鉴!
原文如此:
“在睡眠期间如果产生了退出信号,那么此时该信号是未决的,但是不再受阻塞,所以在
s i g p r o c m a s k返回之前,它被递送到本进程。从程序的输出中可以看到这一点: S I G Q U I T处理
程序(s i g q u i t)中的p r i n t f语句先执行,然后再执行s i g p r o c m a s k之后的p r i n t f语句。
-------------------------------------
问题是睡眠期间没有对SIGQUIT解除block,为何SIGQUIT能够不受阻塞而被捕捉从而导致sig_quit函数能够执行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP