两个fork的简单问题
2010-01-14 18:54
183 查看
1、
pid_t pid;
int listenfd,connfd;
listenfd = socket(...);
bind(...);
listen(...);
while(1)
{
connfd = accept(....);
if((pid = fork()) == 0)
{
//派生出来的自进程,为什么要关闭listenfd?关闭了岂不是父进程也无法再用
close(listenfd);
doit(connfd);
close(connfd);
exit(0)
}
close(connfd);
}
2、
fork重复执行,fork上面的代码会不会重复执行?如果会,那出错怎么办?还是说fork是复制了本进程,然后继续向下执行?
q1、是因为UNIX下的文件都有一个引用计数。引用计数它是当前打开着的引用。该文件或套接口的描述字的个数。accept返回后与connfd关联的文件表项计数为1,fork返回后,两个描述字就在父子进程之间共享,因此这两个套接字相关联的引用计数值从2减为1。该套接口真正清理和释放资源要等到其引用为0时进行。(UNIX网络编程 P97)
q2、fork后是从当前位置向下执行的。
pid_t pid;
int listenfd,connfd;
listenfd = socket(...);
bind(...);
listen(...);
while(1)
{
connfd = accept(....);
if((pid = fork()) == 0)
{
//派生出来的自进程,为什么要关闭listenfd?关闭了岂不是父进程也无法再用
close(listenfd);
doit(connfd);
close(connfd);
exit(0)
}
close(connfd);
}
2、
fork重复执行,fork上面的代码会不会重复执行?如果会,那出错怎么办?还是说fork是复制了本进程,然后继续向下执行?
q1、是因为UNIX下的文件都有一个引用计数。引用计数它是当前打开着的引用。该文件或套接口的描述字的个数。accept返回后与connfd关联的文件表项计数为1,fork返回后,两个描述字就在父子进程之间共享,因此这两个套接字相关联的引用计数值从2减为1。该套接口真正清理和释放资源要等到其引用为0时进行。(UNIX网络编程 P97)
q2、fork后是从当前位置向下执行的。
相关文章推荐
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题
- 【简单的编程问题1】给两个数x和y,求两数中的大者
- 两个简单数学问题的精巧算法
- Network Saboteur 简单dfs(), 计算怎样分两个集合 最优问题 用flag[] 数组标记
- 两个数据库读取问题(十分简单可总是出错)
- 交换两个变量的值的方法-----从简单问题入手
- 交换两个变量的值的方法-----从简单问题入手
- 黑莓:简单方法解决两个以上 Field 左右排列的问题
- 学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】
- 通过细心思考解决看似简单的问题(java求两个int值的平均数)
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 两个简单的小学数学问题
- 乔布斯成功的简单秘方,坚持思考两个问题
- 两个简单的几何问题
- 两个看似简单但却非常难以回答的问题
- 两个简单数学问题的精巧算法
- 统计工龄 模拟EXCEL排序 银行排队问题之单队列多窗口问题 银行业务队列简单模拟 堆栈操作合法性 两个有序序列的中位数
- 问题:取出两个数组相同值,最简单方法(面试陷阱)
- 关于fgets()函数的一个简单问题