2011-08-15 35 views
8

khi tôi sử dụng popen để lấy đầu ra của lệnh, nói dir, nó sẽ nhắc ra một bàn điều khiển. Tuy nhiên,Lệnh C++ popen mà không cần bàn điều khiển

tuy nhiên, tôi có thể lấy đầu ra của lệnh mà không có giao diện điều khiển không?

Tôi đang sử dụng Visual C++ và muốn tạo Thư viện để trả lại kết quả của một số lệnh, ví dụ: dir.

+4

Bạn đang sử dụng nền tảng/chuỗi công cụ nào? – Flexo

+2

Bạn đang sử dụng hệ điều hành nào? Điều này sẽ không xảy ra trong một hệ điều hành thích hợp, ví dụ: Linux, nhưng có thể bạn đang sử dụng ví dụ: Cygwin trong Windows? –

+0

Nếu đây là Windows (và tôi chắc chắn là 100%, vì tôi đã chiến đấu nhiều lần trong nhiều năm), cách đáng tin cậy duy nhất là với CreateProcess. Hầu hết các thư viện khác bỏ qua các cờ cần thiết để ngăn không cho bàn điều khiển con mở. –

Trả lời

2

Với POSIX nó phải được một cái gì đó như thế này:

//Create the pipe. 
int lsOutPipe[2]; 
pipe(lsOutPipe); 

//Fork to two processes. 
pid_t lsPid=fork(); 

//Check if I'm the child or parent. 
if (0 == lsPid) 
{//I'm the child. 
    //Close the read end of the pipe. 
    close(lsOutPipe[0]); 

    //Make the pipe be my stdout. 
    dup2(lsOutPipe[1],STDOUT_FILENO); 

    //Replace my self with ls (using one of the exec() functions): 
    exec("ls"....);//This never returns. 
} // if 

//I'm the parent. 
//Close the read side of the pipe. 
close(lsOutPipe[1]); 

//Read stuff from ls: 
char buffer[1024]; 
int bytesRead; 
do 
{ 
    bytesRead = read(emacsInPipe[0], buffer, 1024); 

    // Do something with the read information. 
    if (bytesRead > 0) printf(buffer, bytesRead); 
} while (bytesRead > 0); 

Bạn tắt khóa học nên kiểm tra giá trị trả lại vv ...

+0

đường ống là gì? Visual Studio đánh dấu từ này. – user883434

+0

Có thư viện nào nên được đưa vào không? – user883434

+0

Có thêm một vài biến mà tôi không biết kiểu của chúng ... – user883434

5

Giả sử Windows (vì đây là nền tảng duy nhất mà hành vi này là loài đặc hữu) :

CreatePipe() để tạo các đường ống cần thiết để giao tiếp và CreateProcess để tạo quy trình con.

HANDLE StdInHandles[2]; 
HANDLE StdOutHandles[2]; 
HANDLE StdErrHandles[2]; 

CreatePipe(&StdInHandles[0], &StdInHandles[1], NULL, 4096); 
CreatePipe(&StdOutHandles[0], &StdOutHandles[1], NULL, 4096); 
CreatePipe(&StdErrHandles[0], &StdErrHandles[1], NULL, 4096); 


STARTUPINFO si; memset(&si, 0, sizeof(si)); /* zero out */ 

si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdInput = StdInHandles[0]; /* read handle */ 
si.hStdOutput = StdOutHandles[1]; /* write handle */ 
si.hStdError = StdErrHandles[1]; /* write handle */ 

/* fix other stuff in si */ 

PROCESS_INFORMATION pi; 
/* fix stuff in pi */ 


CreateProcess(AppName, commandline, SECURITY_ATTRIBUTES, SECURITY_ATTRIBUTES, FALSE, CREATE_NO_WINDOW |DETACHED_PROCESS, lpEnvironment, lpCurrentDirectory, &si, &pi); 

Điều này sẽ giúp bạn thực hiện những gì bạn muốn đạt được.

+2

xin lỗi. Các thư viện cần thiết là gì? – user883434

+0

Các liên kết đến tài liệu MSDN cho bạn biết chính xác các tiêu đề và thư viện cần bao gồm, nhưng thư viện trong trường hợp này là thư viện kernel32 WIN32. –

+0

Hữu ích, nhưng tôi đã phải sử dụng các cờ khác nhau để làm cho nó hoạt động. Xem phần này: http://stackoverflow.com/a/16953192/453673 – Nav

1

Tôi cần giải quyết vấn đề này cho ứng dụng OpenGL Windows toàn màn hình, nhưng không thể ngăn cửa sổ bảng điều khiển bật lên. Thay vào đó, lấy lại tiêu điểm sau một sự chậm trễ ngắn có vẻ hoạt động tốt, đủ để tránh nhìn thấy nó.

_popen(cmd, "wb"); 

Sleep(100); 

ShowWindow(hWnd, SW_SHOWDEFAULT); 
SetForegroundWindow(hWnd); 

Cập nhật: điều này dường như không hoạt động nếu chương trình được khởi chạy từ Explorer. Nó hoạt động khi được khởi chạy từ Visual Studio.

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