http://upload.bbs.csuboy.com/Mon_1004/126_6985_cb9d6bcafda57bd.gif[/img]电影
下面是一个服务器程序的.一个函数的片段,用于向客户端发送数据后等待应答.。教育
由于读socket会.阻塞,我用一个字进程等数据,得到后就向父进程法SIGA.LRM信号。投资
父进程则设置一个空的handle.r()后就睡眠。投资
我用简单的小程.序测试时,.父进程在睡眠结束前收到子进程的信号就会处理,并继续执行。.
但是.这函数中,不.知道为什么,父进程就是收不到子进程的信号,外贸
过路的大侠们帮我看看吧
if((pid = fork()) < 0.) . // 创建子进程[成人用品]
{
printf("fork error\n";http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img].
.exit(1); 女人
}
else if(pid == 0) . //. 子进程 外汇
{
if(recvfrom(sock, rdata, siz.eof(struct udp_data), 0, from, f.romlen) == -1)// 监听socket.,注意如果没有数据到来,这里处于阻塞状态服务器
{
printf("recvfrom error\n";http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img]--- 印刷
. exit(1); . [成人用品]
}
creat("tempfile", PERMS); . // 创建 临时.文件用.来与父进程通信,将收到的数据传送给父进程 健康
fd = open(".t.empfile", O_WRONLY);服务器
.write(fd, rdata, sizeof(struct udp_data)); // 将数据写入临时.文件.
c.lose(fd); 电子
kill(getppid()., SIGALRM.);--------------彩票
. exit(0); . //may be useles.s .
}
else
{
signal(SIGALR..M, handler);投资
usleep(.500 * 1.000); 美容
. 美容
if((fd = open("tempfile.", O_.RDONLY)) == -1) // 尝试打开临时文件,取得数据.
{
. // 文件还没有生成.,说明没有收到数据电脑
. ack = 0;服务器
kill(pid, SIGTSTP); // 超时则重发,.重.新计时.
.break;外贸
. .
}
else
{
. // 得到临时文件 建材
if(read(fd, rdata, s.izeof(struct udp_data).) == 0) 外汇
. {外贸
. . exit(1); 电子
. }<性病>
. c.lose(fd);.
unlink("tempfile"; // 删除临时文件http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img] 乙肝
. . if((rdata->kod == RESPONSE).&&(rdata->ack_num == sdata->seq_num)) // 是否是期待的应答?虚拟主机
. {
. . ack = 1;服务器
. brea.k;<性病>
. } 建材
. else.
. {--- 印刷
. //不是, .重发 外汇
. . ack = 0;服务器
. kill(pi.d, SIGTSTP); 外汇
. . break; 婚庆
. } 汽车
}
}