AsynchronousFileChannel.open зависает при открытии FIFO (именованный канал) для чтения - PullRequest
0 голосов
/ 24 апреля 2020

На Linux, у меня есть именованный канал, созданный в оболочке с использованием mkfifo /tmp/test.

. Я хотел бы использовать его для чтения asyn c, поэтому в качестве первого шага я его открываю используя AsynchronousFileChannel:

java.nio.channels.AsynchronousFileChannel.open(
    java.nio.file.Paths.get("/tmp/test"),
    java.nio.file.StandardOpenOption.READ)
)

Однако вызов зависает:

"main" #1 prio=5 os_prio=0 cpu=1830.11ms elapsed=686.74s tid=0x00007f444c016800 nid=0x6ae8 runnable  [0x00007f44527c2000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.fs.UnixNativeDispatcher.open0(java.base@11.0.7/Native Method)
    at sun.nio.fs.UnixNativeDispatcher.open(java.base@11.0.7/UnixNativeDispatcher.java:71)
    at sun.nio.fs.UnixChannelFactory.open(java.base@11.0.7/UnixChannelFactory.java:267)
    at sun.nio.fs.UnixChannelFactory.newAsynchronousFileChannel(java.base@11.0.7/UnixChannelFactory.java:180)
    at sun.nio.fs.UnixFileSystemProvider.newAsynchronousFileChannel(java.base@11.0.7/UnixFileSystemProvider.java:199)
    at java.nio.channels.AsynchronousFileChannel.open(java.base@11.0.7/AsynchronousFileChannel.java:253)
    at java.nio.channels.AsynchronousFileChannel.open(java.base@11.0.7/AsynchronousFileChannel.java:311)

Возможно ли в Java открыть именованный канал для асинхронных c операций чтения или записи?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020

man open говорит:

   FIFOs
       Opening  the read or write end of a FIFO blocks until the other end is also opened (by an‐
       other process or thread).  See fifo(7) for further details.

Следовательно, вызов Java ведет себя, как и ожидалось, при открытии именованного канала, когда с другим концом больше ничего не подключено. Похоже, что нет способа передать O_NONBLOCK, чтобы получить желаемое поведение неблокирующей open.

1 голос
/ 24 апреля 2020

Чтение на fifo всегда будет блокироваться, пока не будет что почитать. Я подозреваю, что это также применяется при открытии асин c канала. Вы пытались писать на fifo?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...