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
"stdin'e sahip olmak için" itemezsiniz, ancak bir dosyayı kendi stdin'inize yeniden yönlendirebilirsiniz.
freopen("myfile.txt","r",stdin);
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.
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
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 –
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
Yanlış. Yapabilirsin :) –
. Mantar sadece 1 bayt için çalışıyor. İstenen op cgi girişi için kullanılamaz. –