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
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);
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.
Đ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
Đú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"> ;-)) –
- 1. Ghi dữ liệu vào Hadoop
- 2. Nén tệp trong khi đọc dữ liệu từ STDIN
- 3. Ghi vào các nút stdin nodejs đã sinh ra?
- 4. Ghi vào bộ nhớ riêng trong Android
- 5. Ghi dữ liệu VMStat vào tập tin
- 6. Tôi có thể ghi dữ liệu JSON vào một tệp trong iOS/Objective-C không?
- 7. Ghi lại đầu vào trong Linux
- 8. Tại sao mod_wsgi không thể ghi dữ liệu? IOError: thất bại trong việc ghi dữ liệu
- 9. Nguồn dữ liệu SSIS Excel - Có thể ghi đè các kiểu dữ liệu cột không?
- 10. Một Daemon Linux và STDIN/STDOUT
- 11. Làm cách nào để tôi có thể chuyển dữ liệu vào quá trình bắt đầu qua Net :: SSH trên stdin?
- 12. Ghi dữ liệu vào thẻ NFC trong hướng dẫn android
- 13. Ghi siêu dữ liệu EXIF vào hình ảnh trong Android
- 14. Tôi có thể ghi byte trực tiếp vào bộ nhớ video trong Linux, hay có cách nào tốt hơn để lấy dữ liệu lên màn hình?
- 15. Redis có thể ghi vào cơ sở dữ liệu như PostgreSQL không?
- 16. Không thể ghi dữ liệu phiên (tệp)
- 17. PowerShell: Không thể ghi dữ liệu vào một đường dẫn UNC có chứa dấu ngoặc vuông
- 18. Nhiều luồng có thể ghi dữ liệu vào một tệp cùng lúc không?
- 19. Tải dữ liệu Excel vào ứng dụng Linux/wxWidgets C++?
- 20. Làm cách nào tôi có thể bật ghi nhật ký WCF để ghi vào Cơ sở dữ liệu?
- 21. Đếm riêng biệt qua Dữ liệu chính, NSExpression vào NSFetchedResultsController
- 22. riêng stdin và stdout tập tin trong Eclipse
- 23. Liệu một thực thi có thể khám phá ra con đường riêng của nó? (Linux)
- 24. Làm cách nào để kiểm tra xem liệu stdin có một số dữ liệu?
- 25. Nhanh hơn, ghi dữ liệu thô vào ổ đĩa hoặc ghi vào một tệp?
- 26. Không thể tạo/ghi vào tệp - Mã lỗi 13 trong linux
- 27. Có thể bẫy ghi địa chỉ (x86 - linux)
- 28. Dữ liệu cấu hình chương trình trong Unix/Linux
- 29. nodejs ghi dữ liệu hình ảnh thô vào tệp jpeg?
- 30. EntityManager không ghi vào cơ sở dữ liệu
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
Sai. Bạn có thể :) –
. '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. –