2016-07-14 6 views
1

Android의 기본 코드에서 파이프에 쓸 코드가 있습니다. 그러나 프로그램이 쓰기 작업을 차단하지 않는 것 같습니다. 내 이해에 따라 프로그램이 마지막으로 파이프에서 읽는 프로세스가있을 때까지 쓰기를 차단해야합니다. 아래 코드에 무엇이 잘못되었으며 왜 차단없이 종료되는지에 대해 알려주십시오.안드로이드에서 파이프 문제가 발생했습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    const char* PATH = "/data/data/com.endpoint.login/v_pipe8"; 
    char* line = "Hello Pipe!"; 
    int pipe; 

    mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
    pipe = mkfifo(PATH, mode); 
    if (pipe == -1) 
    { 
     printf("mkfifo failure\n"); 
    } 

    sleep(1); 
    int err = write(pipe,line,strlen(line)); 

    if (err == -1) 
    { 
      printf("write error in the pipe\n"); 
    } 

    close(pipe); 
    return 0; 
} 

답변

0

Android의 메모리 경로에 직접 액세스 할 수 없습니다 (기기가 루팅 된 것일 수 있음). 따라서 Android SDK에서 제공하는 경로가 필요합니다. Java에서 its reference 다음에 파이프를 만들고 NDK를 사용하여 개체를 C로 보내고 BufferedReader로 사용합니다.

순수 네이티브 앱이기 때문에 Java가 없으면 C로 직접 만들 수 있지만 조금 복잡합니다. JNI referenceJNI Functions이 필요합니다.

+0

Java와 원시 프로세스간에 파이프를 공유해야합니다. 당신이 언급 한 JNI 부분을 이해하지 못했습니다. 파이프의 경로가 이미 Java와 네이티브 프로세스 사이에 알려져 있다면, 그들은 파이프를 공유하지 않습니까? –

+0

공유하려면 "jint Java_JAVAPACKAGE_writeToPipe (JNIEnv * env, jobject jObject)"와 같은 함수로 Java에서 C를 호출해야합니다. JNI를 유용하게 사용하려면 JNI에 대해 배워야합니다. 당신은 하드 코딩 된 다른 질문에 예제를 가지고 있습니다. http://stackoverflow.com/questions/12844418/android-using-pipe-between-native-and-java-apps – vgonisanz

1

답변을 찾았습니다. 프로그램이 차단되지 않는 문제는 프로그램의 오류입니다.

이 프로그램은 쓰기를 호출하기 전에 열지 않았습니다. 또한 mkfifo는 파이프에 대해 fd를 반환하지 않습니다. 정답은 다음과 같습니다.

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

int main() 
{ 
    const char* PATH = "/data/data/com.endpoint.login/v_pipe8"; 
    char* line = "Hello Pipe!"; 
    int pipe, status; 

    mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
    status = mkfifo(PATH, mode); 
    if (status == -1) 
    { 
     printf("mkfifo failure\n"); 
    } 

    pipe = open(PATH,O_WRONLY); 
    sleep(1); 
    int err = write(pipe,line,strlen(line)); 

    if (err == -1) 
    { 
      printf("write error in the pipe\n"); 
    } 

    close(pipe); 
    return 0; 
} 
관련 문제