2017-11-02 8 views
-1

USB 포트에서 시리얼 데이터를 기록하는 스레드가 있습니다. 세마포어가 게시되고 변수 serial_logging_running1이면 while(serial_logging_running == 1) 루프로 진행하고 연속적으로 직렬 포트와 파일을 읽습니다. 프로그램이 종료되면 신호 처리기는 변수 serial_logging_running0으로 설정합니다. break 문이 while() 루프와 외부 if (res == 0)을 종료하고 null 문을 반환합니까?휴식 시간이 while 루프와 다른 if 루프에서 중단됩니까?

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; 

} 
+8

if-loop는 무엇입니까? –

+0

TLDR; 귀하의 접근 방식은 잘못되었습니다. 이것을 묻는 것은 잘못된 알고리즘을 설계했음을 의미합니다. 알고리즘을 다시 생각하고 다시 시도하십시오. 이것은 단지 충고 일 뿐이며, 원하는 모든 종류의 행동을 강제로 시도 할 수는 있지만 올바른 방식으로 수행하는 것이 항상 더 좋습니다. –

+1

if (serial_logging_running == 0)'while (serial_logging_running == 1)'이 다시 루프에 들어 가지 않기 때문에 'break'는 전혀 필요하지 않습니다. –

답변

0

브레이크는 반면에 의한 루프를 중단. 인 경우 으로 중단 할 루프가 없습니다. 그렇습니다. 이고은 "종료되었습니다"이고 프로그램은 을 반환하고 NULL은을 반환합니다.

2

break while 루프가 중단되고 다른 루프가 if입니다.

if 블록은 관련이 없습니다. breakwhile() { ... } 루프의 끝으로 "점프"합니다.

는 그러나 영업 이익의 경우, breakif (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) 및 널 (null) 문을 반환로 진행됩니까?

코드 흐름은 먼저 while 루프의 끝으로 진행합니다. 그러나 if (res == 0)에는 코드가 없으므로 코드 흐름은 if()으로 완료됩니다. 다음 코드는 close_serial_port_joule();, ,return NULL;입니다.


여기에 break은 필요하지 않습니다. @Iharob Al Asimi

1

키워드 break을 이해합니다. 현재 마지막으로 시작된 루프 블록에서 빠져 나옵니다. if -statement는 어떤 식으로도 루프 블록을 생성하지 않습니다.

그래, 귀하의 프로그램은 break- 문에서 while 루프에서 벗어나서 정상적으로 실행됩니다.