[완료]C언어 초보인데요, 이거 제대로 된건지 누가 좀 봐주세요 ㅠㅠ

netkwak의 이미지

C초보입니다.

여기저기 기웃거려서...
아래 코드를 만들었습니다.

		if(!getstat(fd)) {
			int i;
 
			for(i=0;i<60;i++){
				sleep(1);
				if (getstat(fd)){
					break;
				}
			}
 
			if(i==60){
				const char* w[] = { "/sbin/telinit", "0", NULL };
				syslog(LOG_EMERG, "[!URGENT!] Failure detected.");
				execve("/sbin/telinit", (char**)w, e);
			}
		 break;
		}

제가 구현하고 싶은건,

일단 에러가 검출되면 60초 동안 루프를 돌면서,
대략 60초 안에 회복이 되면 메인으로 돌아가고,
대략 60초가 지나도 계속 에러가 지속되면 시스템을 종료시키려는 코드인데요...

제대로 코딩 된건지 조언좀 부탁 드립니다.

-----------------------------
충고해 주신분들 덕분에 완료 했습니다.
모양새가 좋은지 나쁜지는 판단을 못하겠지만,
일단 제대로 동작하는걸 확인했습니다.

정말 감사합니다.

netkwak의 이미지

if(!getstat(fd)) {
int i;
 
for(i=0;i<60;i++){
sleep(1);
if (getstat(fd)){
 
goto rescan;
 
}
}
 
if(i==60){
const char* w[] = { "/sbin/telinit", "0", NULL };
syslog(LOG_EMERG, "[!URGENT!] Failure detected.");
execve("/sbin/telinit", (char**)w, e);
}
 
rescan:
break;
}

중간에 잘못된 부분이 있는거 같아서,
goto 문으로 루프에서 빠져나오도록 고쳤는데요....
제대로 된건가요?

뭔가 되게 지저분해진거 같은데 ㅠㅠ
좀 깔끔하게 할 수 없을까요?
조언좀 부탁드려요~

whitelazy의 이미지

그냥 돌려 보시고 정상적으로 동작하는지 판별하시면 될꺼같은데....

goto 보다 break.. 로만 빠져나와도 되지 않나요..?

if(i==60) 의 조건을 다시한번 확인하시는건...

ifree의 이미지

루프 인덱스를 다시 조건식에 넣는 것은 바람직하다고 보여지지 않네요.
알아보기도 어렵고.
i 는 루프 안에서만 보이도록 하고, 별도로 상태 변수를 하나 정의하시는게 나을 듯 합니다.

-- 프로그래밍은 수필을 쓰듯이

netkwak의 이미지

if(!getstat(fd)) {
int i,j=0;
 
for(i=0;i<60;i++){
 
sleep(1);
j++;
 
if (getstat(fd)){
 
goto rescan;
 
}
}
 
if(j==60){
const char* w[] = { "/sbin/telinit", "0", NULL };
syslog(LOG_EMERG, "[!URGENT!] Failure detected.");
execve("/sbin/telinit", (char**)w, e);
}
 
rescan:
}

j 를 써서 수정했습니다.

이렇게 하는게 맞는건가요?

lugi의 이미지

int second=0;
 
while(!getstat(fd)){
    sleep(1);    
    if( 60 == ++second)  
        break;
}
 
if(60 == second )
{
    const char* w[] = { "/sbin/telinit", "0", NULL };
    syslog(LOG_EMERG, "[!URGENT!] Failure detected.");
    execve("/sbin/telinit", (char**)w, e);
}

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

netkwak의 이미지

여러분들 조언덕분에 대충 감은 잡혔습니다.

for(;;;){
  if(serial포트거짓이면){
    1초간격으로 60초동안 루프{
        if(serial포트참이면){
            다시 포트감시;
        }
        if(60초다되었으면){
            시스템종료;
        }
    }
 
 
1초간격으로 serial 포트감시;
}

그래서, 이렇게 하려고 합니다만....

다시포트감시 부분을 어찌 처리해야 할지 모르겠네요.

goto를 집어넣는게 제일 좋은가요?

netkwak의 이미지

시험삼아 break; 를 넣어봤는데, 잘 작동하네요.

충고 해주신 모든분들 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.