2014-09-18 6 views
0

나는 FIFO에 쓰는 bash 스크립트를 가지고 있습니다. 그리고 동일한 FIFO에서 읽는 C 프로그램이 있습니다.fifo와 c 프로그램에서 스크립트 bash가 쓰여집니다.

나는 다른 스크립트로 FIFO에서 읽으려고했기 때문에 스크립트가 작동한다고 확신한다. 그러나 C 프로그램에서는 무언가가 작동하지 않습니다. 스크립트를 실행할 때 C 프로그램을 실행하면 서로 기다리고있는 것처럼 보입니다. 여기에 코드가 있습니다. 어디에서 잘못 가고

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 

#define MAX_BUF 1024 

int main(int argc, char *argv[]) 
{ 
    int fd, i; 
    char * myfifo = argv[1]; 
    char buf[MAX_BUF]; 

    fd = open(myfifo, O_RDONLY); 

    while (1) { 
     if(read(fd, buf, MAX_BUF) > 0) 
     { 
      printf("Received: %s\n", buf);  
     } 
    } 

    close(fd); 

    return 0; 
} 

:

#!/bin/bash 

fifo_name="myfifo"; 

# Se non esiste, crea la fifo; 
[ -p $fifo_name ] || mkfifo $fifo_name; 

echo "3" > $fifo_name; 
echo "6" > $fifo_name; 

그리고 여기에 C 프로그램 (독자) :

스크립트는 (작가)인가?

감사합니다.

+0

'open()'호출이 작동하고 절벽으로 행진한다고 가정하기 전에 호출 결과를 확인하지 않는 경우. 'while' 루프를 벗어나는 메커니즘이 없으면 보너스가 될 것입니다. – WhozCraig

답변

2

다음 작업을 수행하면 정상적으로 작동합니다.

  • C 프로그램을 실행할 때 FIFO 파일에 대한 올바른 경로와 인수를 제공해야합니다.

  • 아직 존재하지 않는 경우 FIFO 파일을 생성하기 때문에 쉘 프로그램을 먼저 실행하십시오.

당신은 FIFO이 있지 않은 경우 같은과 함께 C 프로그램 종료를 가짐으로써 alleviatethe 두 번째 문제 수 있습니다 : 당신은 내가 또한 쉘 스크립트를 허용 한

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 

#define MAX_BUF 1024 

int main(int argc, char *argv[]) 
{ 
    int fd, i; 
    char * myfifo = argv[1]; 
    char buf[MAX_BUF]; 

    fd = open(myfifo, O_RDONLY); 

    if (fd == -1) { 
     perror("opening fifo"); 
     return 1; 
    } 
    *buf = '0'; 
    while (strchr (buf,'x') ==NULL) { 
     if((i = read(fd, buf, MAX_BUF)) > 0) 
     { 
      buf[i] = '\0'; 
      printf("Received: [%s]\n", buf); 
     } 
    } 

    close(fd); 

    return 0; 
} 

을 알 수 있습니다 x을 통해 전송하는 경우이를 종료하고 문자열을 인쇄하기 위해 버퍼가 올바르게 종료되었는지도 확인했습니다. 쉘 스크립트에

(사소한) 변경 사항은 다음과 같습니다

Received: [3 
] 
Received: [6 
x 
] 

당신은 당신이 기대하는 것을 항상 아닙니다 볼 수 있습니다

#!/bin/bash 

fifo_name="myfifo"; 

# Se non esiste, crea la fifo; 
[ -p $fifo_name ] || mkfifo $fifo_name; 

echo "3" > $fifo_name; 
echo "6" > $fifo_name; 
echo "x" > $fifo_name; 

나는 C의 끝에서 볼 수있는 출력은 다음입니다 . read 콜은 실제 프로토콜이 맨 위에 겹쳐져 있지 않아 한 번의 히트에서 여러 개의 샌드를 선택할 수 있습니다. 이를 피하려면 자체 프로토콜을 추가해야합니다.

+0

예 .. 그것은 스크립트와 프로그램 C 사이의 단지 길 이었지만 예상대로 작동하지 않습니다. ( "Received : 3 Received : 6".... 나는 대신 "Received : 3 6 "... 그것은 어리석은 것처럼 보일 것입니다. 그러나 나는 그것이 내가 한 번에 fifo의 내용을 읽고 있다는 것을 의미한다고 생각합니다! 그것은 링크 루프의 단지주기가 필요합니다 ... 나는 적어도 2주기를 기대했습니다. ... 나는 bben을 지울 수 있기를 바란다. – Ciccio

+0

Infact 내가 화면을 출력 할 때 화면을 출력 할 때 쓰여지는 값은 ... 대신 블로킹을해야한다 ... 아니요? 스크립트는 행을 쓰고 누군가 읽는 것을 멈추게한다 ... 프로그램 C 읽기, 스크립트 쓰기 다시 두 번째 및 다시 부팅, 프로그램 C 읽기 – Ciccio

+0

@Ciccio, 내 업데이 트를 참조하십시오 메시지에 고유 프로토콜이 없습니다. 당신은 각 전송 사이에 '수면 1'을 깰 수 있지만 심지어 그것을 보장하지 않을 수 있습니다.메시지가'\ n'으로 종료 될 것이라 확신한다면 프로토콜 구분 기호로 사용해야합니다. 단일 읽기에서 여전히 여러 개의 (또는 부분적인) 메시지가 나타날 수 있습니다. 직접 분리해야합니다. – paxdiablo

관련 문제