2016-08-03 1 views
2

나는 fork를 사용하여 두 개의 프로세스를 만들었습니다. 파이프를 만들었습니다. 부모는 파이프의 쓰기 끝에 키를 쓰고 자식 stdin (0)은 파이프의 읽기 끝으로 복제합니다. 그 일이 아주 잘되고 알파벳에 능숙하다는 것을 알기. 하지만 위아래 화살표 키도 보내고 싶습니다. 제발 도와주세요. 당신은 화살표 터미널 편집을 지원하는 쉘을 호출해야C 언어를 사용하여 리눅스에서 파이프를 통해 아래쪽 화살표 키를 보내십시오.

1) :

int main() 
{ 
    int fd[2]; 
    char enter = 10; 
    char *exit = "exit"; 
    char up = 193;//what i have to use here 
    char down = 194;//what i have to use here 
    pipe(p); 
    if(fork()) 
    { 
    write(p[1],&up,1);    //not working 
    write(p[1],&down,1);   //not working 
    write(p[1],exit,strlen(exit)); //working 
    write(p[1],&enter,1);   //working 
    wait(NULL); 
    } 
    else 
    { 
    close(0); 
    dup(p[0]); 
    execl("/bin/sh","sh",NULL); 
    } 
} 

제발 도와주세요,

+0

은 플랫폼에서'char' type'unsigned'입니까? – LPs

+0

ya 서명되지 않은 경우에만 –

+0

"작동하지 않음"이란 무엇을 의미합니까? 예상되는 행동은 무엇이며 실제로 발생하는 것은 무엇입니까? – Marian

답변

3

몇 가지 포인트가 있습니다. 보통의 리눅스에서는 /bin/sh 대신에 /bin/bash 일 수 있습니다.

2.) bash은 입력이 터미널 장치에서 왔는지 여부를 확인하고 있습니다. 이것에 따라 interactive shell처럼 동작합니다. 대화 형 모드에서 사용하려는 것 같습니다. 그러나 파이프는 터미널 장치가 아닙니다. 대화식 모드로 만들려면 호출시 bash 옵션 "-i"를 사용할 수 있습니다.

3. 주석으로 지적했듯이, 일반적인 Linux X- 터미널의 화살표 위아래 코드는 "\ 033 [A"및 "\ 033 [B"]와 같은 다중 문자열입니다. 사용하는 장치 및 환경에 따라 다르며 시스템에 맞는 값이 될 수 있습니다.

다음 코드는 일반적인 리눅스 환경에서 작동 : 또한

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    int p[2]; 
    char enter = 10; 
    char *exit = "exit"; 
    char *up = "\033[A"; 
    char *down = "\033[B"; 
    pipe(p); 
    if(fork()) 
    { 
    write(p[1],up,3); 
    write(p[1],down,3); 
    write(p[1],exit,strlen(exit)); 
    write(p[1],&enter,1); 
    wait(NULL); 
    } 
    else 
    { 
    close(0); 
    dup(p[0]); 
    execl("/bin/bash","bash","-i",NULL); 
    } 
} 

, 당신은 pipefork의 반환 값을 시험해야한다. 개인적으로 나는 다음과 같이 쓸 것입니다 :

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    int p[2]; 
    int r; 
    char command[] = "\033[A\033[Bexit\n"; 

    r = pipe(p); 
    if (r < 0) { 
     perror("Can't create pipe"); 
     return(-1); 
    } 
    r = fork(); 
    if (r < 0) { 
     perror("Can't fork"); 
     return(-1); 
    } else if (r > 0) { 
     close(p[0]); 
     write(p[1], command, sizeof(command)-1); 
     close(p[1]); 
     wait(NULL); 
    } else { 
     close(p[1]); 
     dup2(p[0], 0); 
     close(p[0]); 
     execl("/bin/bash","bash","-i",NULL); 
    } 
} 
+0

위의 코드를 위아래로 시도하지 않았고 하나의 문제가 있습니다. 위의 코드를 종료 한 후에 bash가 입력에 응답하지 않습니다. 터미널을 닫고 다시 열어야하므로 bash의 stdin으로 리디렉션됩니다. –

+0

어떤 종류의 컴퓨터 및 어떤 OS를 사용하고 있습니까? 현학적 인 코드는 파이프 fd를 닫아야하지만 종료시 자동으로 수행됩니다. – Marian

+0

intel i5-4570 CPU, 우분투 포함 15.10 –

관련 문제