2010-12-03 20 views
6

OCaml için oldukça yeni ve OCaml içinden harici bir programı nasıl arayacağımı anlamaya çalışıyordum.OCaml içinden harici bir program çağırın

Ben dokümantasyon here aşağıdaki ve aşağıdaki çağrıyı yapıyorum:

string array -> 'a = <fun> 

Tam olarak nasıl iade anonim işlevini erişebilirim:

Unix.execv "cat text_file";; 

Bu aşağıdaki döndürür?

cat text_file, dosyanın içeriğini yazdırmak için basit bir girişimdir, aslında çalıştırmak istediğim komut biraz daha karmaşıktır. Ancak şunu söyleyebilirim ki, eğer bunu çalıştırabilirsem, gerçek programımı çalıştırmam gerekir.

cevap

10

execv'un ilk argümanı çalıştırmak istediğiniz programdır ve ikincisi argümanları içeren bir dizidir. Ayrıca, execv programın tam yolunu gerektirir; Programı yürütme yolunda aramak için execvp'u kullanabilirsiniz. Ayrıca programın ilk argümanı programın kendisidir. Yani, "cat text_file" ve [| "cat"; "text_file" |] ilk bağımsız değişken olarak "/bin/cat" olmasını ve ikinci argüman olarak execvp numaralı telefonu arayın ve ilk argüman olarak "cat"'u iletin. Ancak, daha sık olmamakla birlikte, aslında system'u değil, execv'u istemezsiniz. system istediğiniz gibi tek dizesi geçirmek ve izin verdiğini

Not olduğunu execv programınızın yapmış ve çağırmak uygulama süreci üzerinde alır execv çağrı kez asla yani döndürür (system farklı olarak).

8

Sepp2k'nin söylediklerine ek olarak, create_process (Unix.file_descr için) veya open_process (kanallar için) kullanmak isteyebilirsiniz. Bu işlevler bir fork/exec yapar ve i/o işlemini yeniden yönlendirir. Bu şekilde, system ile yapamadığınız işlem ile iletişim kurabilirsiniz.

programınızda cat çıktısını okumak istiyorsanız, pipe işlevini kullanarak bir boru oluşturun ve create_process için döndürülen file_descrs kullanabilirsiniz.