我有一个记录USB端口串行数据的线程。当发布信号量并且变量serial_logging_running
为1
时,它将继续执行while(serial_logging_running == 1)
循环并不断读取串行端口并写入文件。退出程序时,信号处理程序将变量serial_logging_running
设置为0
。 break
语句是退出while()
循环还是外部if (res == 0)
然后继续返回空语句?
static void *logging(void *param) {
int rdlen, res;
char ibuf[1024];
sem_wait(&logging_semaphore);
/*Open log file and write to it from /dev/USB1*/
create_open_log_file();
res = log_dut_serial_data(serial_port);
if (res) {
fprintf(stderr,"Error opening the serial port%s\n",serial_port);
}
if (res == 0) {
while(serial_logging_running == 1) {
/*read from serial port write to log file*/
rdlen = read(fd_joule, ibuf, sizeof(ibuf));
if (rdlen > 0) {
fwrite(ibuf, sizeof(char), rdlen, log_file);
fflush(log_file);
}
if (rdlen < 0) {
fprintf(stderr, "rdlen les than 0\r\n");
}
/* Exit the serial logging thread*/
if (serial_logging_running == 0) {
printf("Exiting serial logging thread\r\n");
break;
}
}
}
close_serial_port_joule(); /*Exiting close the serial port*/
return NULL;
}
答案 0 :(得分:2)
break
语句是否会突破while循环和其他if
循环?
if
块不相关。 break
将“跳转”到while () { ... }
循环的末尾。
然而在OP的情况下,break
将离开if (serial_logging_running == 0) { }
并跳转到几乎 if (res == 0) { }
的结尾。
if (res == 0) {
while(serial_logging_running == 1) {
...
if (serial_logging_running == 0) {
...
break; // Jump to end of while loop
}
}
// break "lands" here
}
break
语句是退出while()
循环还是外部if (res == 0)
然后继续返回空语句?
没有。代码流将首先进入while循环结束。然而,由于if (res == 0)
没有更多代码,代码流将完成if()
。接下来的代码是close_serial_port_joule();
,然后 return NULL;
。
另请注意,此处不需要break
。 @Iharob Al Asimi
答案 1 :(得分:1)
了解关键字SELECT id, code
FROM table
WHERE (id, delta) IN (SELECT id, MIN(delta)
FROM table
GROUP BY id);
。它突破了当前最后发起的循环块。 break
- 语句不会以任何方式生成循环块。
所以是的,你的程序在if
- 语句中突破了while循环,并在此之后正常执行。
答案 2 :(得分:0)
中断会打断while引起的循环。没有循环可以打破如果。所以是的,而是&#34;终止&#34;并且程序流向返回NULL -statement。