- 论坛徽章:
- 0
|
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 编辑 ]
|