社区
Linux/Unix社区
帖子详情
select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
qsxiaoyao
2008-12-20 04:54:09
公司产品上有段以前的代码,在select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
...全文
201
10
打赏
收藏
select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
公司产品上有段以前的代码,在select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qsxiaoyao
2008-12-22
打赏
举报
回复
还有就是不管用exit(0)还是continue,进程都能正常工作,板子工作也正常,通过webserver访问也能看到视频听到音频
qsxiaoyao
2008-12-22
打赏
举报
回复
[Quote=引用 8 楼 guosha 的回复:]
没看明白啥意思,有没有定义CONFIG_WATCHDOG?
另外并不是select返回小于0就肯定是出错了,select被信号中断时也是会返回小于0的
[/Quote]
CONFIG_WATCHDOG没有定义,是我想在这个进程中起用看门狗加的,这时候发现那个exit(0)会引起看门狗不喂狗而板子重启,所以改成了continue;但这时select<0的那个printf就会一直打印出来。
我也觉得是信号量或中断引起的<0,但就是不明白为什么开始用exit(0)后就不会打印出selece<0的信息
快乐田伯光
2008-12-22
打赏
举报
回复
没看明白啥意思,有没有定义CONFIG_WATCHDOG?
另外并不是select返回小于0就肯定是出错了,select被信号中断时也是会返回小于0的
qsxiaoyao
2008-12-22
打赏
举报
回复
代码如上,在select<0的那个printf每次会打印出来,如果用exit(0),以后就不会再进到这来,但程序没有退出,一直在执行。
如果用continue,则经常会进入到<0这来。
qsxiaoyao
2008-12-22
打赏
举报
回复
int main(int argc, char **argv)
{
fd_set rfds, wfds;
struct timeval tv;
int max_sock, retval;
#ifdef CONFIG_WATCHDOG
/*******************watchdog init*********************/
if ((fd = open("/dev/wdt", O_RDWR)) < 0) {
printf("Open /dev/wdt error!\n");
return -1;
}
signal(SIGUSR1, disable_wdt);
ioctl(fd, WDT_SET_TIMEOUT, 353200);
ioctl(fd, WDT_SET_MODE, 1);
ioctl(fd, WDT_ENABLE, 1);
init_sigaction();
init_time();
/*******************watchdog init********************/
#endif
init();
signal(SIGTERM, term_handler);
if (open_server_sock() < 0) {
printf("Open socket error!\n");
return -1;
}
while(1) {
FD_ZERO(&rfds);
FD_ZERO(&wfds);
max_sock = 0;
/*read a frame for sending. 30 frames per second*/
av_read_frame();
select_server_sock(&max_sock, &rfds, &wfds, NULL);
select_parse_conn(&max_sock, &rfds, &wfds, NULL);
select_redir_conn(&max_sock, &rfds, &wfds, NULL);
select_av_conn(&max_sock, &rfds, &wfds, NULL);
select_audio_conn(&max_sock, &rfds, &wfds, NULL);
tv.tv_sec = 0;
tv.tv_usec = 33333;
retval = select(max_sock + 1, &rfds, &wfds, NULL, &tv);
if (retval == 0) {
// timeout process
//puts("main() : select = 0");
continue;
}
if (retval < 0) {
printf("ipcamd: error on select: %s\n", strerror(errno));
#ifdef CONFIG_WATCHDOG
continue;
#else
exit(0);
#endif
}
process_server_sock(&rfds, &wfds, NULL);
process_parse_conn(&rfds, &wfds, NULL);
process_redir_conn(&rfds, &wfds, NULL);
process_av_conn(&rfds, &wfds, NULL);
process_audio_conn(&rfds, &wfds, NULL);
}
return 0;
}
cceczjxy
2008-12-22
打赏
举报
回复
那换_exit()看看
hngsc_0
2008-12-20
打赏
举报
回复
select 一般不会出错,查看下你的代码,估计不是小于0了,很有可能是超时了
正常返回的是数据准备好的文件描述符或者超时返回
outblue
2008-12-20
打赏
举报
回复
select成功返回正数,超时返回0,出错返回负数。你怎么知道select出错了呢?
threeleafzerg007
2008-12-20
打赏
举报
回复
完整代码 基本如果你gdb单步调到exit(0);程序一定会推出个 所以给我们看完整代码。。。
qsxiaoyao
2008-12-20
打赏
举报
回复
在exit(0);下面再加一个exit(0);时,程序就会退出,这是为什么了?
continue循环,
exit
退出
,
select
循环
continue循环,
exit
退出
,
select
循环
ABAP 7.5+
退出
指令实战:CHECK/
EXIT
/RETURN/LEAVE 5种场景代码对比
本文深入解析ABAP 7.5+中的5种
退出
指令(CHECK/
EXIT
/RETURN/LEAVE PROGRAM/LEAVE TO TRANSACTION),通过循环控制、子
程序
退出
、屏幕流处理等实战场景对比其行为差异,帮助开发者精准控制
程序
执行流程,提升S/4HANA开发效率。
exit
与_
exit
区别
注:
exit
()就是
退出
,传入的参数是
程序
退出
时
的状态码,0表示正常
退出
,其他表示非正常
退出
,一般都用-1或者1,标准C里有
EXIT
_SUCCESS和
EXIT
_FAILURE两个宏,用
exit
(
EXIT
_SUCCESS);可读性比较好一点。 作为系统
调用
而言,_
exit
和
exit
是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #def
MYSQL存储过程之异常处理
exit
、continue
exit
遇到错误就会执行特定语句 continue遇到错误会忽略错误
继续执行
创建表的代码如下: CREATE TABLE `_t1`( `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `val1` VARCHAR(20) DEFAULT NULL, `varl2` INT(11) DEFAULT NULL )ENGINE=INNO...
select
调用
标签(空格分隔): Linux C/C++
select
调用
1. 函数
调用
原型int
select
(int maxfdp1,fd_set *readset,fd_set *writeset, fd_set *exceptset,const struct timeval *timeout)2.参数说明2.1 timeout参数结构体定义:struct timeval { long tv_sec
Linux/Unix社区
23,224
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章