2014-02-07 226 views
0

是否可以使用C程序寫入正在運行的shell(Bash)的stdin?其實我想用C程序中的bash執行命令,而不使用exec*()系統調用。從C程序執行shell命令

+1

最終,您將需要一個fork()和一個exec *()調用運行'bash'程序;沒有任何真正的選擇(除非你數['posix_spawn()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn.html),而我沒有)。那麼,在'bash'上組織管道的問題是爲了處理標準輸入(從你的程序?)和標準輸出(到你的程序?)和標準錯誤,以及正確的shell選項('-i'?)。你預計在你的俘虜外殼中執行什麼樣的命令? –

+0

我只是想從我的程序中獲取一個字符串輸入,並將此字符串發送到任何正在運行的bash實例,並且bash會爲我執行執行並將相應的輸出發送到我的程序。 –

+0

請注意,您不能隨意將您的命令發送給Bash的任意運行實例;他們中的大多數都與別人的工作掛鉤,並且位於錯誤的當前目錄中,並且設置了錯誤的環境等等。你將需要運行你自己的shell;如果你小心的話,你不必爲每個單獨的命令運行一個新的shell,但是你需要fork()和exec *()和你通信的bash。你需要兩到三個管道(shell的標準輸入,shell的標準輸出,可能是shell的標準錯誤),你需要考慮如何讀取它們。 –

回答

0

/bin/echo是一個C程序,通常。

/bin/echo ls | sh 

Voilà!一個C程序剛剛寫入正在運行的shell的標準輸入,並執行了一條命令。這顯然是可能的。

man popen現在是你的朋友。 (超越用戶的範圍,超出用戶的範圍,system()以及需要引用等討論)

+0

還有一個程序'/ bin/echo';但是,大多數shell都有一個內置命令'echo'。 –

+0

使用內置模塊會不必要地回答問題。儘管可以指向'/ bin/echo'並說「這是一個編譯好的C程序,在那個文件裏,」。 – JdeBP