2017-12-05 4 views
-2

Linux Mint XFCE 18.2를 사용하고 있습니다. 내가 문자열 방정식을 해결하기 위해 노력하고 있어요 (사용자가 GTK_ENTRY에 몇 가지 방정식을 입력). 이를 위해 문자열을 시스템 쉘에 전달하여 응답을 평가합니다. 그것은이 추가로 0에서를 인쇄c 인쇄시 system() 기능

$ ./a.out 
15 
0 

모든 시간 - :이 실행 이제까지 나는이 결과를 얻을 때 여기

이 너무 큽니다 실제 코드)

int main() 
{ 
    long g = system("expr 8 + 7"); 
    printf("%ld \n",g); 
} 

을 :-(내 코드입니다 이 0은 어디에서 왔습니까? 나는 15를 인쇄하기를 원한다. g 변수에 값을 할당하고 싶다.

+1

'man 시스템 '에서'system'의 반환 값의 의미는 무엇입니까? 필요없는 경우 - printf를 제거하십시오. –

+0

'system()'을 사용하여 명령 출력을 얻을 수 없습니다. – larsks

+0

'expr'에 대한 문서를 읽으십시오. 계산 된 값으로 무엇을 말하는가? –

답변

0

시스템 창 : 리턴 값은 오류 -1이다 (예를 들면, 포크 (2)가 실패), 그렇지 않은 명령의 복귀 상태.후자의 리턴 상태는 wait (2)에 지정된 형식입니다. 따라서 명령의 종료 코드는 WEXITSTATUS (상태)입니다./bin/sh를 실행할 수없는 경우 종료 상태는 종료하는 명령의 종료 상태입니다 (127). command의 값이 NULL 인 경우, system()은 쉘이 사용 가능한 경우 0이 아닌 값을 반환하고 그렇지 않은 경우 0을 반환합니다.

system()은 다른 하위의 대기 상태에 영향을주지 않습니다.

당신은는 popen 사용할 수 있습니다

int main() 
{ 
    FILE *in=NULL; 
    char temp[256]; 
    in=popen("expr 8 + 7", "r"); 
    fgets(temp, 255, in); 
    printf("%s", temp); 
    return 0; 
} 

을 나는 그것이의 도움을 바랍니다.

0

출력을 파일로 방향 재 지정한다. system 호출은 사용자가 지정한 명령을 실행 한 다음 g에 저장하고 인쇄 한 종료 상태를 반환합니다. expr 8 + 7이 오류없이 실행 되었기 때문에 종료 상태는 입니다. 식의 결과를 보는 이유는 명령의 일부로 stdout을 리디렉션하지 않았기 때문입니다. 따라서 식 평가가 콘솔에 표시됩니다. 명령의 출력을 캡처하려면 일부 파이프를 열어야합니다.

0

두 가지 방법 :

int main() 
{ 
    long g = system("expr 8 + 7"); 
} 

또는

int main() 
{ 
    long g = 8 + 7; 
    printf("%ld \n",g); 
} 

당신이 쉘에서 명령을 실행하는 좋은 이유가없는 system를 사용하는, C에서의 좋은 생각을 프로그래밍을 사용하는 경우 . c은 직접 표현식을 평가할 수 있습니다.

+0

표현식이 문자열 형식입니다. –

0
system("expr 8 + 7"); 

위의 명령문은 어떻게 실행됩니까? system() 함수는 쉘 (bash)을 내부적으로 호출 한 다음 bash은 CLI에서와 같이 expr 8 + 7을 실행합니다.

[email protected]:~/doubt$ expr 7 + 8 
15 

지금 사람 페이지에서 system()return 값을 확인 "반환되는 값은 -1 오류에 (예를 들어, 포크 (2) 실패), 그렇지 않으면 명령의 반환 상태", 경우 셸이 system()에 제공된 명령을 실행할 수 있다면 success의 경우 0 인 결과는 status입니다. 그래서 여분의 printf를 제거하면 system()은 어쨌든 stdout 버퍼에 결과를 인쇄합니다.

expr 결과를 변수에 저장하려면 여러 가지 방법이 있으므로 system() 결과를 파일로 리디렉션 할 수 있습니다.

다음은 간단한 방법 나는 그것이의 도움을 희망

int main(int argc, char *argv[]) 
{ 
     int fd = open(argv[1],O_RDWR | 0664); 
     if(fd == -1) { 
       perror("open"); 
       return 0; 
     } 

     dup2(3,1);// result of system will redirected into file, from file you can fetch the result and can do whatever you want. 
     system("expr 8 + 7"); 

} 

에게 있습니다.