2012-04-05 2 views
2

scanf를 사용하여 입력을 기다리는 프로그램의 바이너리가 있습니다. 키보드 입력을 시뮬 레이팅 할 수있는 C 코드를 작성해야합니다. 즉 그 바이너리에 대한 stdin 포인터를 닫고 그것을 파일에 repoint한다. 이 코드C에서 프로그램의 키보드 입력을 시뮬레이트하는 방법

int main() 
{ 
     FILE *fin; 
     int result; 
     char string[80]; 
     close(0); 

     fin = fopen("text", "r"); 

     if(NULL == fin) 
     { 
       printf("Unable to open file."); 
       return 0; 
     } 
     dup(fin); 
     return 0; 
} 

을 사용하지만 난 각 프로그램은 자신의 표준 입력 포인터를 가지고 있음을 발견했다. 다른 C 프로그램에서 하나의 이진 파일에 대해 키보드 입력을 시뮬레이트 할 수있는 방법이 있습니까?

+0

첫 번째 프로그램에 대한 바이너리 만 있으므로 코드를 변경할 수 없으므로 키보드 버퍼 대신 파일을 읽는 scanf가 필요합니다. :/도움? – user434885

+0

귀하의 질문과 의견을 묻는 사이에 1 분 미만입니다. :/인내? – Puppy

답변

5

그것은 당신의 쉘의 기능, 당신이 찾고있는 프로그램이 아니다 :

program < input.txt 

당신이 프로그램에 대한 표준 입력으로 input.txt을 밀어 이런 식으로.

프로그램을 원한다면 프로그램을 실행하고 출력을 다른 프로그램 입력으로 리 라우팅 할 수 있습니다.

+0

그래서 쉘 스크립트를 작성 하시겠습니까? 너는 네가 대답 한 것을 자세히 설명해 줄 수 있니? 나는 이해하지 못한다. .. 미안 :/ – user434885

+0

당신의 대답에서 "프로그램"은 무엇입니까? 프로그램 ID입니까? 아니면 그것을 실행하는 방법입니까? 바이너리가 입력을 여러 번받는 대신 키보드 대신 파일에서 항상 입력을 받습니까? – user434885

+1

너는, 천재 야 ... 나는 바보 야! 나는 출력을 파일로 리다이렉트하는 데 약 백만 번이나했는데, 내가 입력과 똑같이 할 수 있다는 것을 결코 잊지 않았다. 고마워! – user434885

-1

셸은 터미널 세션에 명령 프롬프트를 제공하는 프로그램입니다. Wiki article에 설명 된대로 간단한 프로그래밍 언어를 지원합니다.

일반적으로 익숙하지 않은 용어를 볼 때 위키피디아와 검색 엔진은 강력한 동맹자가됩니다. 그것들을 사용하면 인생이 빨리 좋아질 것이며 지식은 기하 급수적으로 늘어날 것입니다.

희망이 도움이됩니다.

1

프로그램을 기본 방법으로 호출 할 때 간단한 pipe을 사용할 수 있습니다.

또 다른 방법은 키보드 시뮬레이터를 실행기로 사용하는 것입니다. 시뮬레이터의 stdout으로 테스트중인 프로그램을 stdin으로 시작해야합니다.

당신은 당신의 프로그램을 보내고 fork하여 후자를하고 파이프하고 공급하고자하는 프로그램이 파이프와 exec 파일 기술자를 사용 stdin (심지어 stdout을) 재개 자식 프로세스를 생성하기 위해 부모 프로세스를 사용할 수 있습니다 에 입력하십시오.

은 (당신 만 파일 기술자를 줄 것이다 pipe 만들기와 같은) 파이프 파일 기술자에 대한this에 대한 this 참조하십시오.

P .: 죄송합니다. 현재 코드를 제공 할 수 없지만 유닉스 워크 스테이션 근처에 있지 않으며 메모리에서 안정적인 코드를 작성하기 위해 UNIX OS 프로그래밍에서 너무 녹슬지는 않습니다.

0

셸에서이 기능을 사용하지 않으려는 경우 표준 입력 파일 설명자를 닫고 읽을 파일을 대신 열 수 있습니다. 방금 닫은 fd의 수를 얻습니다. 이것은 쉘이 리다이렉션을 구현하는 방법 일 가능성이 큽니다.

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main(void) 
{ 
    int fd; 
    char buf[128]; 

    close(STDIN_FILENO); 

    fd = open("./testfile", O_RDONLY); 
    if(fd < 0) return 1; 

    scanf("%127[ a-z0-9]", buf); 
    puts(buf); 

    close(fd); 
    return 0; 
} 
1

나는 100 % 확신 할 수 없지만, exec 함수 중 하나를 사용하여 C 코드에서 바이너리 프로그램을 시작하면 작동 할 것입니다. 왜냐하면 예, 설명하기가 어렵 기 때문입니다.)더 많은 정보를 원하시면 man 페이지를보십시오 :

man 3 exec 

대개의 경우 exec *는 fork와 함께 사용되지만, 여러분이 포크 할 필요는 없을 것입니다.

관련 문제