2013-10-19 5 views
0

나는 표준 입력으로부터 읽은 바이트 수를 결정하는 C 프로그램을 작성하고있다. 나는 프로그램이 입력을 기다리는 동안 명령 줄에 입력하는 입력 linux는 명령어를 찾는다.

  • 파이프

    • 프로그램에 입력을 제공하는 방법이 발견

    정확한을 찾는 방법 프로그램이 쉘에서 실행 된 명령. 명령 줄 인수를 사용해 보았지만 실패했습니다. 쉘이 당신에게 그 인자의 일부를 전달할하지 않을 수 있습니다 - 또한

    #include <stdio.h> 
    
    int main(int argc,char *argv[]) 
    { 
         char buffer[100]; 
         int n; 
    
         for(n=1;n<argc;n++) 
           printf("argument: %s\t",argv[n]); 
    
         printf("\n"); 
         if(argc==1) 
           printf("waiting for input :"); 
         else if (argc==3) 
           printf("Not waiting for input . Got the source from command itself ."); 
    
         n = read(0,buffer,100); 
         if(n==-1) 
           printf("\nError occured in reading"); 
         printf("\nReading successfully done\n"); 
    
         return 0; 
    } 
    

    , 일반적으로

  • +0

    'fflush'를'read' 전에 ​​호출하는 것을 잊었습니다 –

    +0

    당신의 프로그램이나 다른 프로그램에 의해 읽혀진 바이트를 세고 싶다면 분명하지 않습니다 .... –

    답변

    1

    , 당신은 당신의 프로그램 내부에서 그렇게 할 수 없습니다. 프로그램을 실행하거나 인수를 얻기 전에 확장 된 glob, I/O 리다이렉션 등을 할 것입니다.

    ps -o args으로 전화를 걸어 볼 수 있습니다. 문제가있을 수 있습니다. 그래도 내가 알기에 리다이 렉션을주지는 않을 것이다.

    0

    당신은 몇 가지 옵션이 있습니다. argv가 어떻게 호출되었는지 확인하십시오 (argv [0]이 전체 경로, 상대 경로, 현재 디렉토리로 호출되었는지 또는 이전/s .s를 기준으로 $ PATH를 사용했는지 또는 알지 못했는지 여부를 알려주는 argv [0] 그)

    당신은 같은 그것을 호출 한 부모 프로세스 얻을 수 있습니다 : 당신이 다른 정보를 얻을 수

    sprintf(buf,"/proc/%d/cmdline",getppid()); 
    fd=open(buf,O_RDONLY); 
    read(fd,buf,buf_size); 
    write(1,buf,strlen(buf)); 
    

    을에서/proc 디렉토리/PID/... 위와 같이 GETPID 사용하여 현재 명령 (getppid가 아님)

    일단 부모 프로세스를 얻으면, 더 많은 행동을 취할 수 있습니다. 예를 들어 부모의 basename이 sh 또는 bash이면 열어서 내역 파일을 읽은 다음 앱의 발생을 찾을 수 있습니다. 그것은 그것을 호출 한 전체 명령을 보여줍니다. 다른 응용 프로그램은 비슷한 내역 파일을 가질 수 있습니다.

    관련 문제