먼저 간단히
scanf() 로 입력 받은 값을 바로 프린트 해주는 무한 루프로 된
프로그램 cmd 가 있고
이 프로그램을 system() 으로 호출하는 프로그램 syscmd
가 있다고 할때
syscmd 에서 직접 scanf() 에 어떤 입력을 줄 수 있는 방법이
있을까요..
$ man popen
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h> do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
어떤 방법으로 popen을 사용해 제 문제를 해결 할 수 있는지
감이 오질 않네요..
조금더 힌트를 주시면 안될까요.
system()대신 popen()으로 외부 프로그램을 실행을 시키시고... 이 값을 받아 sscanf()에서 이용하시면 됩니다.
좀 더 자세히 설명을 드리면... syscmd 에서 sscanf()에 입력할 값을... printf() 로 출력을 하고... 이 값을 popen() 이 받아서 sscanf()에 넘겨 주는 방법으로 하시면 됩니다.
//cmd.c #include <stdio.h> #include <stdlib.h> int main() { int i=0; while(1) { scanf("%d",&i); printf("%d hi\n",i); } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; int state; fp = popen("./cmd","w"); if(fp==NULL) { perror("erro: "); exit(0); } printf("1"); // fputs("1\n",fp); pclose(fp); return 0; }
이런 상태에서 어디를 손보면 될까요..
출력값은 0 hi 0 hi 0 hi 0 hi ... 0 hi ...
이렇게 무한 루프로 빠져 버립니다..
왜 그런 것인가요..
제생각에는 무한 루프로 돌아가는게 맞는 것 같은데요 우선 팝오픈을 실행시키면 커맨드가 종료할때까지 대기 상태가 되는 것 같습니다.그런데 커맨드가 무한 루프라서 프로그램 종료가 안되는 것 같은데 어느정도 쓰레드 동기화나 그런거 해줘야 하지 않을까 생각합니다.
인생이란게 다 그런게 아니겠어요....? 뭘(?)http://schutepen.egloos.com
여기가 문제네요.
while(1) { scanf("%d",&i); printf("%d hi\n",i); }
// cmd.c #include <stdio.h> int main() { int i; while (scanf("%d", &i) > 0) printf("%d\n", 2 * i); return 0; } // syscmd.c #include <stdio.h> int main() { FILE* fp = popen("./cmd", "w"); int i; setvbuf(fp, NULL, _IONBF, 0); // for interactive I/O while (scanf("%d", &i) > 0) fprintf(fp,"%d\n", i); fclose(fp); return 0; }
좀 더 자세히 설명을 드리면... syscmd 에서 sscanf()에 입력할 값을... printf() 로 출력을 하고... 이 값을 popen() 이 받아서 sscanf()에 넘겨 주는 방법으로 하시면 됩니다
위의 내용이 이해가 잘 안가는데요..
printf()로 출력을 한 것을 어떻게 popen() 이 받는건지요..
음... 위의 문제라면... 걍...system("cmd | echo 123");
system("cmd | echo 123");
텍스트 포맷에 대한 자세한 정보
<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]
[code:1]$ man popen[/code:1] <어떠한
$ man popen
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
말씀하신 popen 이 해결책인가요..
어떤 방법으로 popen을 사용해 제 문제를 해결 할 수 있는지
감이 오질 않네요..
조금더 힌트를 주시면 안될까요.
system()대신 popen()으로 외부 프로그램을 실행을 시키시고..
system()대신 popen()으로 외부 프로그램을 실행을 시키시고...
이 값을 받아 sscanf()에서 이용하시면 됩니다.
좀 더 자세히 설명을 드리면...
syscmd 에서 sscanf()에 입력할 값을...
printf() 로 출력을 하고...
이 값을 popen() 이 받아서 sscanf()에 넘겨 주는 방법으로 하시면 됩니다.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
자세한 답변 감사합니다..
syscmd.c
이런 상태에서 어디를 손보면 될까요..
위에 코드를 실행시키면,
출력값은
0 hi
0 hi
0 hi
0 hi
...
0 hi
...
이렇게 무한 루프로 빠져 버립니다..
왜 그런 것인가요..
제생각에는 무한 루프로 돌아가는게 맞는 것 같은데요 우선 팝오픈을 실행시
제생각에는 무한 루프로 돌아가는게 맞는 것 같은데요 우선 팝오픈을 실행시키면 커맨드가 종료할때까지 대기 상태가 되는 것 같습니다.그런데 커맨드가 무한 루프라서 프로그램 종료가 안되는 것 같은데 어느정도 쓰레드 동기화나 그런거 해줘야 하지 않을까 생각합니다.
인생이란게 다 그런게 아니겠어요....? 뭘(?)
http://schutepen.egloos.com
여기가 문제네요.[code:1] while(1&#
여기가 문제네요.
syscmd에서 받는 입력이 끝나도 무한 루프를 돌게 되니까요.
입력 스트림의 끝(EOF) 또는 유효한 입력이 들어왔는지는 검사해야죠.
약간 변형해서 sysmd에서 입력받는 값의 2배를 cmd가 출력하는 예입니다.
서지훈님 말씀 중에
위의 내용이 이해가 잘 안가는데요..
printf()로 출력을 한 것을 어떻게 popen() 이 받는건지요..
음...위의 문제라면...걍...[code:1]system&#
음...
위의 문제라면...
걍...
system("cmd | echo 123");
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
댓글 달기