免费注册 查看新帖 |

Chinaunix

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

为什么我的程序在accept之后就变成了精灵进程? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-22 16:00 |只看该作者 |倒序浏览
20可用积分
我写了一个很简单的socket服务器段,功能是在socket(),bind(),listen()之后,进入一个循环
accept得到一个socket,如果成功就fork一个子进程并打印一条成功信息,关闭该socket,主进程继续accept.

然后我运行server的时候,程序先阻塞到accept这里,然后用一个client去连它。server程序打印了一条信息以后,ps -ef看它的父进程变成了1,然后控制终端也交还给了shell
现象是这样的:

终端1                                                                                                                              终端2
[zhang@localhost kg]$ serv                                                                                       [zhang@localhost kg]$client
connection accepted
fork success
in connection, sin_family=2,sin_port=41190,sin_addr=16777343
connection closed
[zhang@localhost kg]$ connection accepted                                                         [zhang@localhost kg]$client
fork success
in connection, sin_family=2,sin_port=41446,sin_addr=16777343
connection closed

问题:
也就是说,运行client的时候,会使server打印一条信息,但是server的终端IO并没有被阻塞,而且第一次accept以后变成了daemon, 这是为什么呢???????
我在centOS linux5.2+gcc4.1.2上。
------------------------------------------------------------------------------------------------------------------------------------------------------------
附上我的服务器端代码和客户端代码

>cat serv.cpp
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<errno.h>
#include<unistd.h>//fork,getpid
extern int errno;
int main(int argc,char* argv[]){
int backlog=argc<=1? 100:atoi(argv[1]);
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
  printf("socket failed for server,%s\n",strerror(errno));
  return 1;
}
sockaddr_in my_addr;
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(10080);//using htol will cause it not work
my_addr.sin_addr.s_addr=htons(INADDR_ANY);
//on some systems, htons is not in arpa/inet.h, but in <netinet/in.h>
bzero(&(my_addr.sin_zero),;

if(bind(sockfd,(sockaddr*)&my_addr,sizeof(struct sockaddr))==-1){
  printf("socket bind failed,%s\n",strerror(errno));
  return 1;
}
if(listen(sockfd,100)==-1){
  printf("socket listen failed,%s\n",strerror(errno));
  return 1;
}
while(true){
  sockaddr_in sin_in;
  socklen_t size;//=sizeof(sin_in);
  int news=accept(sockfd,(sockaddr*)&sin_in,&size);
  if(news<0){
   printf("socket accept failed,%s\n",strerror(errno));
   continue;
  }
  printf("connection accepted\n";
  pid_t p=fork();
  if(p<0){
   printf("main process fork failed\n";
   close(news);
   continue;
  }else if(p==0){//father process
   printf("fork success\n";
   continue;
  }else{//p>0, p=get_pid(parent), child process
   printf("in connection, sin_family=%d,sin_port=%d,sin_addr=%d\n",
    sin_in.sin_family,sin_in.sin_port,sin_in.sin_addr.s_addr);
   printf("connection closed\n";
   close(news);
   return 0;
  }
}
return 0;
}
>cat client.cpp
//include的部分和上面相同
extern int errno;
int main(void){
int s=socket(PF_INET,SOCK_STREAM,0);
if(s==-1){
  printf("socket function failed,%s\n",strerror(errno));
  return 1;
}
sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port  =htons(10080);//use htonl will cuase it not working
server.sin_addr.s_addr=inet_addr("127.0.0.1";//htons(INADDR_ANY) means all local ethernet address;
if(connect(s,(sockaddr*)&server, sizeof(server))==-1){
  printf("connect failed,%s\n",strerror(errno));
  return 1;
}
close(s);
return 0;
}

最佳答案

查看完整内容

f(p==0){//father process printf("fork success\n"; continue;}假如我没记错的话, pid==0的是子进程。 另外这样的情况只是程序在后台运行而已, 顶多称为后台进程。精灵进程定义不是这样的。另外shell直接fork出来的程序退出或者暂停, 那么控制权就会交给shell的了。[ 本帖最后由 pagx 于 2009-3-22 20:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-22 16:00 |只看该作者
f(p==0){//father process
   printf("fork success\n";
   continue;
}
假如我没记错的话, pid==0的是子进程。 另外这样的情况只是程序在后台运行而已, 顶多称为后台进程。精灵进程定义不是这样的。另外shell直接fork出来的程序退出或者暂停, 那么控制权就会交给shell的了。

[ 本帖最后由 pagx 于 2009-3-22 20:56 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-22 18:39 |只看该作者
pid==0的是子进程

论坛徽章:
0
4 [报告]
发表于 2009-03-22 20:08 |只看该作者
UP楼上说的没错

论坛徽章:
0
5 [报告]
发表于 2009-03-22 21:33 |只看该作者
没错,是你把父子进程搞反了的原因
不过server接受了第一次连接后就退出了吧,怎么是变成精灵进程了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP