Работа с именованными каналами в Android

Тема в разделе "WASM.UNIX", создана пользователем drem1lin, 21 мар 2017.

Метки:
  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Всем доброго вечера, я хочу протестировать возможность отправить сообщение между процессами в Android через именованный канал, для этого написал программку на С

    Код (Text):
    1. #include <stdio.h>
    2. #include <unistd.h>
    3. #include <sys/stat.h>
    4. #include <fcntl.h>
    5. #include <asm-generic/fcntl.h> // for open
    6. #include <sys/wait.h>
    7.  
    8. #define MAX_BUF 100
    9. #define EXIT_FAILURE 2
    10. int main() {
    11.     char * myfifo = "/data/local/tmp/myfifo";
    12.     pid_t pid_1 = 0;
    13.  
    14.     /* create the FIFO (named pipe) */
    15.     if(mkfifo(myfifo, 0666) != 0)
    16.     {
    17.         printf("mkfifo failed, errno = %d\n", errno);
    18.         unlink(myfifo);
    19.         return 1;
    20.     }
    21.  
    22.     /* write "Hi" to the FIFO */
    23.    
    24.  
    25.     switch(pid_1=fork()) {
    26.     case -1:
    27.         printf("fork error %d\n", pid_1); /* произошла ошибка */
    28.         break;
    29.     case 0:
    30.         {
    31.         char buf[MAX_BUF];
    32.         int fd;
    33.         printf("Child\n");
    34.         fd = open(myfifo, O_RDONLY | O_NONBLOCK);
    35.         if (fd == -1) {
    36.             printf("client open FIFO error\n"); /* произошла ошибка */
    37.             unlink(myfifo);
    38.             return EXIT_FAILURE;
    39.         }
    40.         if(read(fd, buf, MAX_BUF)>0)
    41.             printf("Received: %s\n", buf);
    42.         unlink(myfifo);
    43.         break;
    44.         }
    45.     default:
    46.         {
    47.         int fd;
    48.         int status=0;
    49.         sleep(2);
    50.         fd = open(myfifo, O_WRONLY);
    51.         if (fd == -1) {
    52.             printf("server open FIFO error\n"); /* произошла ошибка */
    53.             unlink(myfifo);
    54.             return EXIT_FAILURE;
    55.         }
    56.         write(fd, "Hi", sizeof("Hi"));
    57.         close(fd);
    58.         waitpid(pid_1, &status, 0);
    59.         /* remove the FIFO */
    60.         unlink(myfifo);
    61.         break;
    62.         }
    63.     }
    64.     return 0;
    65. }
    66.  
    Программка тестовая, но все же старался сделать правильнее. Но почему то возникают проблемы при работе
    Логи получаю следующие
    Child
    server open FIFO error
    Child exited with status 2

    Приму любые комментарии, под Linux писать только начал, и поэтому не много путаюсь.
    Почему сервер не может открыть именованный канал?
    Я понимаю, что можно воспользоваться strace, но на Android его нет.
     
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.087
  3. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Благодарю за ответ, но это не совсем то. У меня создается сам pipe, но есть проблемы с его открытием. И второе, по ссылке в коментах,автор пишет, что начиная с android 5.1 у него есть проблемы с открытием локальных сокетов. http://stackoverflow.com/questions/31068440/cannot-connect-to-native-local-socket-on-android-5-1
     
  4. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    В общем я сумел поковыряться во всяком и нашел ответ на Linux Mint, на android пока проверить не могу. В общем я изменил мод в mkfifo и удалил nonblock из open со стороны клиента.