2012-05-22 12 views
17
ifconfig | grep 'inet' 

đang hoạt động khi được thực hiện qua thiết bị đầu cuối. Nhưng không phải qua QProcessLệnh hoạt động trong thiết bị đầu cuối, nhưng không qua QProcess

mẫu mã của tôi là

QProcess p1; 
p1.start("ifconfig | grep 'inet'"); 
p1.waitForFinished(); 
QString output(p1.readAllStandardOutput()); 
textEdit->setText(output); 

Không có gì là nhận được hiển thị trên TextEdit.

nhưng khi tôi chỉ sử dụng ifconfig khi bắt đầu qprocess, đầu ra sẽ được hiển thị trên văn bản. Tôi có bỏ lỡ bất kỳ mẹo nào để xây dựng lệnh ifconfig | grep 'inet', như sử dụng \' cho '\| cho |? cho các ký tự đặc biệt? nhưng tôi đã cố gắng mà cũng :(

+0

bạn cần chỉ định đường dẫn đầy đủ cho ifconifg. Ứng dụng của bạn có biến PATH khác nhau sau đó bạn thiết bị đầu cuối –

+0

@KamilKlimek Vì đây có thể là vấn đề đối với các lệnh đơn lẻ, trong trường hợp này, các đường dẫn lệnh (không được QProcess hỗ trợ) là vấn đề thực sự. – leemes

+0

Phải! totaly quên về điều đó –

Trả lời

34

QProcess thực hiện một quá trình duy nhất. . những gì bạn đang cố gắng làm là thực hiện một lệnh vỏ, không phải là một quá trình các đường ống các lệnh là một tính năng của shell của bạn

có ba giải pháp khả thi:.

Đặt comman d bạn muốn được thực hiện như một cuộc tranh cãi để sh sau -c ("lệnh"):

QProcess sh; 
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet"); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

Hoặc bạn có thể viết các lệnh như đầu vào tiêu chuẩn để sh:

QProcess sh; 
sh.start("sh"); 

sh.write("ifconfig | grep inet"); 
sh.closeWriteChannel(); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

Một cách tiếp cận mà tránh sh, là để khởi động hai QProcesses và làm đường ống trong mã của bạn:

QProcess ifconfig; 
QProcess grep; 

ifconfig.setStandardOutputProcess(&grep); // "simulates" ifconfig | grep 

ifconfig.start("ifconfig"); 
grep.start("grep", QStringList() << "inet"); // pass arguments using QStringList 

grep.waitForFinished(); // grep finishes after ifconfig does 
QByteArray output = grep.readAll(); // now the output is found in the 2nd process 
ifconfig.close(); 
grep.close(); 
+0

Và nó được thực hiện như thế nào? – ScarCode

+5

Tôi đã thêm các ví dụ mã cho một số giải pháp khả thi. – leemes

+2

Grep đã làm việc.Nhưng tôi muốn ống đầu ra của ifconfig để awk '/inet/{gsub(/.*:/,"",$1);print$1}'. mà thành công in một số o/p trên thiết bị đầu cuối và không thông qua Qprocess. Tôi đã sử dụng cho tôi 2 giải pháp của bạn – ScarCode

6

Đối tượng QProcess không tự động cung cấp cho bạn cú pháp vỏ đầy đủ thổi: bạn không thể sử dụng ống Sử dụng một lớp vỏ cho việc này:.

p1.start("/bin/sh -c \"ifconfig | grep inet\""); 
+1

Tôi đã thử điều này quá. nhưng vẫn không hoạt động !! – ScarCode

+1

À vâng, nó phải là dấu ngoặc kép, không phải dấu ngoặc kép. – kmkaplan

+3

thay thế (an toàn hơn vì bạn không phải chú ý đến việc thoát trong đối số, nếu nó phức tạp hơn): sử dụng QStringList cho các đối số, như sau: 'p1.start ("/bin/sh ", QStringList() < <"-c" << "ifconfig | grep inet"); ' – leemes

4

bạn không thể sử dụng p ipe biểu tượng trong QProcess có vẻ như.

Tuy nhiên, có phương pháp setStandardOutputProcess sẽ dẫn đầu ra cho quá trình tiếp theo.

Ví dụ được cung cấp trong API.