一个进程问题,有请高手指点

hjtpal 2003-08-19 03:14:40
在收到 accept() > 0
if (fork() == 0)
{
/* 子进程代码段 */
if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
{
perror("send出错!");
}
printf("first:\n");
close(client_fd);
printf("second");
exit(0);

}
printf("fourth\n");
printf("fiveth\n");
close(client_fd);

服务端运行结果
fourth
fiveth
first
second

查看 ps -ef|grep user
运行两次后 发现

8422 951 0 12:20 pts/1 00:00:00 ./server.out
8424 8422 0 12:20 pts/1 00:00:00 [server.out <defunct>]
8429 8422 0 12:20 pts/1 00:00:00 [server.out <defunct>]

子进程没有退出这样每连接一次就多产生一个进程,为什么?
怎样做到子进程运行完了,就结束了。是否父进程要wait()?怎样做?
...全文
36 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphawin 2003-08-20
  • 打赏
  • 举报
回复
子进程对父进程都会有牵制
fierygnu 2003-08-20
  • 打赏
  • 举报
回复
父进程退出不会给子进程发送HUP信号。参考:http://www.chinaunix.net/forum/viewtopic.php?t=136383
ianzy 2003-08-19
  • 打赏
  • 举报
回复
通常说来,子进程在退出时向父进程发 SIGCHLD 信号。父进程可能通过 wait 系列函数取得子进程退出时的返回值(即exit调用的参数值)和子进程非正常退出时(通常是收到信号)的信号值。如果不需要知道这些值,可以调用 sigset( SIGCHLD, SIG_IGN ) 忽略该信号。

顺便补充一下,如果父进程退出则给子进程发送 SIGHUP 信号,不处理的话则子进程也会退出。如果处理的话则子进程的父进程ID变为 1(即UNIX初始进程).
CoolQ 2003-08-19
  • 打赏
  • 举报
回复
把你的程序这样改一下
pid_t pid;
int status;
if ((pid = fork()) == 0)
{
/* 子进程代码段 */
if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
{
perror("send出错!");
}
printf("first:\n");
close(client_fd);
printf("second");
exit(0);

}
wait(&status);
printf("fourth\n");
printf("fiveth\n");
close(client_fd);
这样结果就对了。
子进程在退出的时候会向父进程发送SIGCHLD信号。
hjtpal 2003-08-19
  • 打赏
  • 举报
回复
fierygnu(va_list) :

请问signal(SIGCHLD, signal_handler);什么时候发出信号?
父进程在那个地方发这个信号比较合适?

fierygnu 2003-08-19
  • 打赏
  • 举报
回复
void signal_handler(int sig)
{
//在这里wait
}

int main()
{
...
signal(SIGCHLD, signal_handler);
...
}

wwwunix 2003-08-19
  • 打赏
  • 举报
回复
你要在父进程中回收结束的子进程。用wait()或waitpid()

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧