LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1007|回复: 6

求教fork中的socket现象

[复制链接]
发表于 2005-4-14 10:40:00 | 显示全部楼层 |阅读模式
[PHP]
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
main()
{
        int pid, ssock, x;
        for (x = 1; x < 5; x++)
        {
                pid = fork();
                if (pid == 0)
                {
                        ssock = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
                        printf("ssock: %d ,cycle: %d\n",ssock,x);
                        return;
                }
        }
        wait();
        printf("main exit\n");
}
[/PHP]

运行结果:
woody:~/test# ./test1                 
pid: 21544,ssock: 3 ,cycle: 1
pid: 21545,ssock: 3 ,cycle: 2
pid: 21547,ssock: 3 ,cycle: 4
pid: 21546,ssock: 3 ,cycle: 3
main exit
woody:~/test#


为什么每次fork出来的进程用socket函数在系统注册的通信端口都是同一个,这样各个进程用同一个通信端口会出问题的.
发表于 2005-4-14 11:57:47 | 显示全部楼层
你的程序那里可以看出通信端口是一样的啦?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-14 13:07:44 | 显示全部楼层
ssock的值呀,都是3
如果都是父进程中建立的就会是3、4、5这么下去的

如果说fork出来的进程之间ssock的值是没有影响的话
在实际的程序中,fork出来的进程会在sendto的时候说没有操作权限,最后仅仅只有一个进程能正常的继续下去。
如果把socket在主程序建立四个,那么fork出来的程序都能很好的工作。
回复 支持 反对

使用道具 举报

发表于 2005-4-14 20:40:02 | 显示全部楼层
ssock是端口吗?我看到的书都是把它称为套接字,端口指的是另外的概念。
fork后每个进程是独立的,申请的套接字互相不影响。
把本书好好看看,你的基础概念需要重新学习。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-14 21:15:22 | 显示全部楼层
我最初也是这么想的,可是实际程序运行起来的确有问题,只要socket都在父进程中申请,然后再fork子进程程序运行就非常正常.
回复 支持 反对

使用道具 举报

发表于 2005-4-14 21:37:31 | 显示全部楼层
你打印的那句时在子进程里的阿.父进程没有打开一个socket,所以子进程继承父进程的fd:0,1,2.
子进程再打开一个socket就是3了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-15 14:30:17 | 显示全部楼层
不好意思,我找到原因了,代码都没有问题,是硬件的原因.只要在其他机器上跑就没有问题.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表