参考资料:《UNIX网络编程 卷1:套接字联网API》
文章:《Linux进程状态(ps stat)之R、S、D、T、Z、X》(转载)
测试环境:虚拟机+Fedora18、win7+SocketTool.exe
服务端程序如下:
#include "unp.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
Close(connfd); /* parent closes connected socket */
}
}
#include "unp.h"
void
str_echo(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
again:
while ( (n = read(sockfd, buf, MAXLINE)) > 0)
Writen(sockfd, buf, n);
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
err_sys("str_echo: read error");
}
编译后运行!
这时可使用SocketTool.exe连接上来,端口为9877,ip为fedora的ip地址
用命令查看
#netstat -a
可看到 第一条,服务端正处在监听状态,
查看进程间的关系,可用如下命令:
#ps -t pts/6 -o pid,ppid,tty,stat,args,wchan
此处运行出错,因我使用终端不是 tty
,故改用如下命令:
#ps -o pid,ppid,tty,stat,args,wchan
Z为僵死进程
为清楚看出父子进程关系,可用如下命令:
#ps -axjf