2012-06-20 15 views
10

IDE'den cgi betiğimde (C++) hata ayıklamak istiyorum, bu yüzden bir "hata ayıklama kipi" oluşturmak istiyorum: diskten dosya oku, stdin'e Bu dosyaya karşılık gelen ve betiğin geri kalanını web sunucusu tarafından çağrılan bazı ortam değişkenlerini ayarlayın. Mümkün mü ve eğer öyleyse, bunu nasıl yapabilirim?Linux'ta kendi stdin'e veri yazabilirmiyim

cevap

10

"stdin'e sahip olmak için" itemezsiniz, ancak bir dosyayı kendi stdin'inize yeniden yönlendirebilirsiniz.

freopen("myfile.txt","r",stdin); 
+0

Peki, stdio varsayarak, [fungetc] var (http://pubs.opengroup.org/onlinepubs/7908799/xsh/ungetc.html). Ancak bu, geri itmenin bir baytından fazlasını garanti etmiyor. – ephemient

+1

Yanlış. Yapabilirsin :) –

+0

. Mantar sadece 1 bayt için çalışıyor. İstenen op cgi girişi için kullanılamaz. –

2

Herkes standart girdi STDIN_FILENO olarak tanımlanan bir dosya tanıtıcı olduğunu bilir. Değerinin 0 olması garanti edilmese de, başka hiçbir şey görmedim. Her neyse, bu dosya tanımlayıcısına yazmanızı engelleyen hiçbir şey yoktur. Örnekte, burada kendi standart girişe 10 mesaj yazabilir küçük bir programdır: test.cpp içine kaydet

#include <unistd.h> 
#include <string> 
#include <sstream> 
#include <iostream> 
#include <thread> 

int main() 
{ 
    std::thread mess_with_stdin([]() { 
      for (int i = 0; i < 10; ++i) { 
       std::stringstream msg; 
       msg << "Self-message #" << i 
        << ": Hello! How do you like that!?\n"; 
       auto s = msg.str(); 
       write(STDIN_FILENO, s.c_str(), s.size()); 
       usleep(1000); 
      } 
     }); 

    std::string str; 
    while (getline(std::cin, str)) 
     std::cout << "String: " << str << std::endl; 

    mess_with_stdin.join(); 
} 

, derlemek ve çalıştırmak:

$ g++ -std=c++0x -Wall -o test ./test.cpp -lpthread 
$ ./test 
Self-message #0: Hello! How do you like that!? 
Self-message #1: Hello! How do you like that!? 
Self-message #2: Hello! How do you like that!? 
Self-message #3: Hello! How do you like that!? 
Self-message #4: Hello! How do you like that!? 
Self-message #5: Hello! How do you like that!? 
Self-message #6: Hello! How do you like that!? 
Self-message #7: Hello! How do you like that!? 
Self-message #8: Hello! How do you like that!? 
Self-message #9: Hello! How do you like that!? 
hello? 
String: hello? 
$ 

"? Merhaba" bölüm, tüm 10 iletinin gönderilmesinden sonra yazdığım bir şey. Daha sonra giriş ve program çıkışlarını belirtmek için Ctrl + D tuşlarına basın.

+3

Bu biraz işe yarıyor, çünkü dosya tanımlayıcılarının 0, 1 ve 2'nin hepsinin pty'ye bağlı olduğu bir terminalde bulunuyorsunuz. Programın geri okuyabileceği bir şey yazmıyorsunuz. Bu konuyla ilgili bir açıklama için http://stackoverflow.com/q/1441251 adresine bakın. – ephemient

+0

Doğru. Eğer tty'den ayrılırsanız, girişiniz de kapatılabilir. Tam bir çözümün içeriğe bağlı olduğunu düşünüyorum. Boru/dup2 vb. Yapmak oldukça mümkündür. Eğer stdin'i yeniden açarsanız, std :: cin' vb. Bir robotun sürekli olarak "Daha fazla girişe ihtiyaç duyduğunu"> ;-) söylediği bir filmi hatırlatıyor –