2012-06-20 31 views
10

Tôi muốn gỡ lỗi script cgi (C++) của tôi từ IDE, vì vậy tôi muốn tạo một "chế độ gỡ lỗi": đọc tệp từ đĩa, đẩy nó vào stdin riêng, thiết lập một số biến môi trường, tương ứng với tệp này và chạy phần còn lại của tập lệnh khi nó được gọi bởi máy chủ web. Có thể và nếu có, thì làm thế nào tôi có thể làm điều đó?Có thể ghi dữ liệu vào stdin riêng trong Linux

Trả lời

10

Bạn không thể "đẩy sở hữu stdin", nhưng bạn có thể chuyển hướng tệp đến stdin của riêng bạn.

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

Vâng, giả sử stdio, có [fungetc] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/ungetc.html). Nhưng điều đó không đảm bảo nhiều hơn một byte push-back. – ephemient

+1

Sai. Bạn có thể :) –

+0

. 'fungetc' chỉ hoạt động với 1 byte. Nó không thể được sử dụng cho đầu vào cgi như op dự định. –

2

Mọi người đều biết đầu vào chuẩn là bộ mô tả tệp được xác định là STDIN_FILENO. Mặc dù giá trị của nó không được đảm bảo là 0, tôi chưa bao giờ thấy bất kỳ điều gì khác. Dù sao, không có gì ngăn cản bạn ghi vào bộ mô tả tập tin đó. Vì lợi ích của Ví dụ, đây là một chương trình nhỏ mà viết 10 tin nhắn tới đầu vào tiêu chuẩn riêng của mình:

#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(); 
} 

Save đó vào test.cpp, biên dịch và chạy:

$ 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? 
$ 

Các "? Hello" một phần là thứ mà tôi đã gõ sau khi tất cả 10 tin nhắn được gửi đi. Sau đó, bạn nhấn Ctrl + D để cho biết kết thúc của các lần thoát đầu vào và chương trình.

+3

Điều đó xảy ra với vẻ hơi làm việc vì bạn đang ở một thiết bị đầu cuối nơi các bộ mô tả tập tin 0, 1 và 2 đều được gắn với pty. Bạn không viết bất cứ điều gì mà bản thân chương trình có thể đọc lại. Xem http://stackoverflow.com/q/1441251 để biết một số giải thích về chủ đề này. – ephemient

+0

Đúng. Nếu bạn được tách ra khỏi tty, fd đầu vào của bạn cũng có thể được đóng lại. Tôi đoán một giải pháp chính xác phụ thuộc vào ngữ cảnh. Nó là hoàn toàn có thể làm ống/dup2 vv Và nếu bạn mở lại 'stdin', làm thế nào về' std :: cin' vv? Nhắc tôi về một bộ phim mà một robot liên tục nói "Cần thêm đầu vào"> ;-)) –

Các vấn đề liên quan