2016-09-06 6 views
0

誰かが私がここで間違っていることを理解するのを助けることができますか?なぜこのexec.Commandが別の開かれたttyに正しく動作しないのですか

別のtty(この場合は/ dev/ttys001)で実行されるコマンド(この場合はvimを開く)を実行しようとしています。これは端末の別のタブで開きます。

以下のコードを実行すると、vimが/ dev/ttys001のウィンドウに表示されますが、実際にそのウィンドウからstdinに入力すると正しく登録されません。

アドバイスはありがとうございます!

package main 

import (
    "log" 
    "os" 
    "os/exec" 
) 

func main() { 
    tty, err := os.OpenFile("/dev/ttys001", os.O_RDWR, os.ModePerm) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    defer tty.Close() 

    c := exec.Command("vim") 
    c.Stdin = tty 
    c.Stdout = tty 
    c.Stderr = tty 
    if err := c.Run(); err != nil { 
     log.Fatalln(err) 
    } 
} 

は、私はまた、次のコードでコマンドのSysProcAttrフィールドを設定しようとしたが、エラーが表示されている:フォーク/ execのは/ usr/local/bin/vimの:デバイスには不適切IOCTL。興味を持って誰のために

procAttr := &syscall.SysProcAttr{ 
    Setpgid: true, 
    Ctty:  int(tty.Fd()), 
    Foreground: true, 
} 
c.SysProcAttr = procAttr 
+0

c.Wait()の後に呼び出します。 – AJPennster

+0

Hey @AJPennster、私は現在c.Runを使用していますが、c.Startとc.Runは自動的にWaitを呼び出します。 –

+0

ああ、私はそれを逃した。 – AJPennster

答えて

0

、私は解決策を考え出したが、私はシステムを使用するようになってしまった呼び出す代わりのOS/execのパッケージの機能。

package main 

import (
    "log" 
    "os" 
    "syscall" 
    "unsafe" 
) 

var tty = "/dev/ttys001" 
var cmd = "vim\n" 

func main() { 
    ttyFile, err := os.Open(tty) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    defer ttyFile.Close() 

    cbs, err := syscall.ByteSliceFromString(cmd) 
    if err != nil { 
     log.Fatalln(err) 
    } 

    var eno syscall.Errno 
    for _, c := range cbs { 
     _, _, eno = syscall.Syscall(syscall.SYS_IOCTL, 
      ttyFile.Fd(), 
      syscall.TIOCSTI, 
      uintptr(unsafe.Pointer(&c)), 
     ) 
     if eno != 0 { 
      log.Fatalln(eno) 
     } 
    } 
} 
関連する問題