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.
Nguồn
2011-08-15 15:45:27
Bạn đang sử dụng nền tảng/chuỗi công cụ nào? – Flexo
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? –
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ở. –