2010-12-23 14 views
5

Erlang'da bir terminal aygıtı dosyasını açmanın herhangi bir yolu var mı?Erlang kullanarak bir aygıt dosyası açma

Ben Solaris üzerinde ve ben şu :: çalışıyorum

olarak erlang dosya sürücüsü yukarıda görülebilir

 
Erlang (BEAM) emulator version 5.6 [source] [64-bit] [async-threads:0] [kernel-poll:false] 

/xlcabpuser1/xlc/abp/arunmu/Dolphin/ebin 
Eshell V5.6 (abort with ^G) 
1> file:open("/dev/pts/2",[write]). 
{error,eisdir} 
2> file:open("/dev/null",[write]). 
{ok,} 
3> 
boş fle açılması hiçbir sorunu var ama bir terminal cihazı dosya açılmaz !!

Dosya sürücüsü boş dosya açabildiği için bir sonuca varılamıyor.

Terminal aygıt dosyalarını açmanın başka yolu var mı?

Teşekkür

+0

Bir geçici çözüm size yardımcı olabilir: kendinize bir sarıcı yazabilirsiniz örn. Bir bağlantı noktası olarak başladığınız C veya python'da. – ZeissS

+0

@ZeissS: Evet, yapacak. Ama neden böyle gitmediğini düşünüyordum? Bunu perl'de yapabilirim. – Arunmu

cevap

8

Güncelleme: Bir bağlantı noktasını kullanarak aşağıda açıklanan sınırlama geçici bir çözüm başardı. Örneğin, burada o baskılar "merhaba dünya" /dev/stdout etmek için örnek bir programdır:

-module(test). 
-export([main/1]). 

main(X) -> 
    P = open_port({spawn, "/bin/cat >/dev/stdout"}, [out]), 
    P ! {self(), {command, "hello world"}}. 

bir liman düzenli dosyası gibi hareket etmez, çünkü bu biraz rahatsız edici, ama en azından almak için tek yoldur iş bitmiş. dosyası (ISREG(statbuf) çek) normal bir dosya değilse

if (stat(name, &statbuf) >= 0 && !ISREG(statbuf)) { 
#if !defined(VXWORKS) && !defined(OSE) 
     /* 
     * For UNIX only, here is some ugly code to allow 
     * /dev/null to be opened as a file. 
     * 
     * Assumption: The i-node number for /dev/null cannot be zero. 
     */ 
     static ino_t dev_null_ino = 0; 

     if (dev_null_ino == 0) { 
      struct stat nullstatbuf; 

      if (stat("/dev/null", &nullstatbuf) >= 0) { 
       dev_null_ino = nullstatbuf.st_ino; 
      } 
     } 
     if (!(dev_null_ino && statbuf.st_ino == dev_null_ino)) { 
#endif 
      errno = EISDIR; 
      return check_error(-1, errInfo); 
#if !defined(VXWORKS) && !defined(OSE) 
     } 
#endif 
    } 

Bu kod (karışıklığa) EISDIR hata verir: (erts/emulator/drivers/unix/unix_efile.c olarak) efile_openfile() yılında


Aşağıdaki kod var değilse, dosya özellikle /dev/null'dir. file(3) belgelerine durumları:

 eisdir : 
     The named file is not a regular file. It may be a directory, a 
     fifo, or a device. 

yüzden aslında bunu belgeli. — niçin bu kısıtlamanın var olduğundan emin değilim, belki de performansla ilgili bir şey var çünkü aygıt sürücüleri normal bir dosyadan genellikle daha fazla süre engelleyebilir.

+0

Cevap için gerçek kodu :) göstererek teşekkürler. http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:11378:mpdmhaofpeahahgaggmg – Arunmu

İlgili konular