Tôi đã thử sử dụng CreateProcess để chạy một lệnh đơn giản như hg > test.txt
. Tôi đã thử chạy chuỗi như một toàn thể (như trái ngược với việc tách nó thành một tên ứng dụng và các tham số của nó). Tại sao CreateProcess(0, "notepad.exe test.txt", ...)
hoạt động nhưng CreateProcess(0, "hg > test.txt", ...)
thì không?Làm cách nào để chuyển hướng đầu ra tới tệp bằng CreateProcess?
Trả lời
Bạn không thể sử dụng chuyển hướng stdout trong dòng lệnh được chuyển đến CreateProcess
. Để chuyển hướng stdout, bạn cần chỉ định một tập tin xử lý cho đầu ra trong cấu trúc STARTUPINFO
.
Bạn cũng đang mắc lỗi khác, tinh tế hơn. Tham số thứ hai, lpCommandLine
phải trỏ đến bộ nhớ có thể ghi bởi vì CreateProcess
ghi đè bộ đệm. Nếu bạn tình cờ sử dụng phiên bản ANSI của hàm thì bạn sẽ thoát khỏi điều này, nhưng không phải với phiên bản Unicode.
Phiên bản Unicode của chức năng này, CreateProcessW, có thể sửa đổi các nội dung của chuỗi này. Do đó, tham số này không thể là con trỏ tới bộ nhớ chỉ đọc (chẳng hạn như một biến số const hoặc chuỗi chữ). Nếu tham số này là một chuỗi không đổi, hàm có thể gây ra sự vi phạm truy cập.
Đối với những người tò mò về lý do tại sao bạn cần phải vượt qua trong một bộ đệm ghi: [Tại sao chức năng 'CreateProcess' sửa đổi dòng lệnh đầu vào của nó?] (Http://blogs.msdn.com/b/oldnewthing/archive/2009/06 /01/9673254.aspx) –
Anh ấy không nhất thiết mắc lỗi bằng cách không đặt điểm tham số thứ hai thành bộ nhớ ghi được.Có thể anh ta không biên dịch với 'UNICODE' được định nghĩa, trong trường hợp đó' CreateProcess' là 'CreateProcessA', mà không có yêu cầu này. –
@ FrerichRaabe Đó là một chi tiết thực hiện của các phiên bản Windows hiện tại. Nếu bạn nhìn vào tài liệu MSDN, bạn sẽ thấy rằng kiểu tham số thứ hai là 'LPTSTR'. Trong mọi trường hợp, tôi đã thực hiện chính điểm mà bạn đưa ra trong đoạn thứ hai của tôi. –
CreateProcess() khởi chạy quá trình, nó không phải là dòng lệnh itnerpreter. Nó không biết ">" là gì và sẽ không thực hiện chuyển hướng luồng cho bạn. Bạn cần phải mở tập tin test.txt bản thân và vượt qua tay cầm vào nó để CreateProcess bên trong cấu trúc STARTUPINFO: CreateProcess STARTUPINFO
Microsoft có một ví dụ làm thế nào để chuyển hướng đầu ra tiêu chuẩn: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx.
Vâng, đó là loại công việc, nhưng hãy nhớ có một lỗi trong ví dụ đó ngăn chặn 'ReadFromPipe' từ thoát. Trước khi bạn gọi hàm đó, bạn cần gọi: 'CloseHandle (g_hChildStd_OUT_Wr);'. Cũng có thể bạn sẽ muốn đợi cho quá trình con thoát ra trước khi bạn đóng xử lý để xử lý với một cái gì đó như: 'WaitForSingleObject (piProcInfo.hProcess, INFINITE);'. – Nux
Đoạn mã dưới đây tạo quy trình không có bàn điều khiển với stdout và stderr được chuyển hướng đến tệp được chỉ định.
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE h = CreateFile(_T("out.log"),
FILE_APPEND_DATA,
FILE_SHARE_WRITE | FILE_SHARE_READ,
&sa,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL ret = FALSE;
DWORD flags = CREATE_NO_WINDOW;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = NULL;
si.hStdError = h;
si.hStdOutput = h;
TCHAR cmd[]= TEXT("Test.exe 30");
ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if (ret)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
return -1;
}
Mô tả cùng với mã sẽ có ích. Ít nhất ý kiến –
Có thể ĐóngHandle() của tệp sau khi quá trình con sinh ra bị bỏ qua. – SerG
Không nên hStdInput được INVALID_HANDLE_VALUE thay vì NULL? –
bạn nên chạy quy trình cmd.exe với thông số "/ c dòng lệnh". Điều này sẽ chuyển hướng đầu ra đến một tệp hoặc tổ chức một đường dẫn thông qua CreateProcess.
- 1. Làm cách nào để chuyển hướng đầu ra của DBMS_OUTPUT.PUT_LINE tới một tệp?
- 2. Làm cách nào để chuyển hướng đầu ra trong web.py
- 3. Làm cách nào để chuyển hướng đầu ra tới một tệp có tên là ngày và giờ hiện tại?
- 4. Chuyển hướng Đầu ra theo dõi tới Bàn điều khiển
- 5. cách chuyển hướng đầu ra của lệnh sang hai tệp
- 6. Làm cách nào để chuyển hướng đầu ra tiêu chuẩn sang một tệp trong Perl?
- 7. có cách nào để chuyển hướng đầu vào và đầu ra đến cùng một tệp không?
- 8. Chuyển hướng đầu ra grep sang tệp
- 9. Làm cách nào để chuyển hướng đầu ra của hàm chết sang một tệp trong Perl?
- 10. C++ Đầu ra chuyển hướng
- 11. Chuyển hướng đầu ra bằng lệnh "màn hình"
- 12. Làm cách nào để chuyển hướng https: // yêu cầu tới http: // bằng NGINX?
- 13. Chuyển hướng đầu ra lệnh "đặt" vào tệp nhật ký
- 14. Làm thế nào để chuyển hướng đầu ra của .exe vào một tệp trong python?
- 15. Làm thế nào để chuyển hướng đầu ra của hệ thống() vào một tệp?
- 16. Làm cách nào để chuyển hướng đầu ra từ tập lệnh Groovy?
- 17. Chuyển hướng đầu ra từ vỏ erlang vào một tệp
- 18. Chuyển hướng đầu ra Trace.axd
- 19. Làm thế nào để chuyển hướng (Rack) Đầu ra máy chủ mỏng đến bàn điều khiển?
- 20. backclace glibc - không thể chuyển hướng đầu ra đến tệp
- 21. Cách chuyển hướng đầu ra của ứng dụng dưới nền tới/dev/null
- 22. Chuyển hướng đầu ra bash sang tên tệp động
- 23. sử dụng lệnh tee để chuyển hướng đầu ra tới một tệp trong một thư mục không tồn tại
- 24. Làm thế nào để gửi đầu ra theo dõi tới một tệp trong hệ thống tệp?
- 25. Làm thế nào để chuyển hướng từ đầu ra âm thanh sang đầu vào mic bằng PulseAudio?
- 26. Cách chuyển hướng đầu vào và đầu ra tiêu chuẩn bằng Bash
- 27. chuyển hướng đầu ra tiêu chuẩn bằng c sau đó đặt lại đầu ra tiêu chuẩn
- 28. làm cách nào để chuyển hướng kết quả đầu ra của nosetests đến một textfile?
- 29. Làm thế nào để chuyển hướng tất cả đầu ra đến/dev/null?
- 30. Các khối mã chuyển hướng đầu ra đầu vào
'CreateProcess' không biết về chuyển hướng. Tại sao bạn không sử dụng 'hệ thống (3)'? Hãy để tôi đoán: bạn có thể làm điều đó tốt hơn so với hệ thống (3). – cnicutar
@cnicutar Tôi luôn tự hỏi ý nghĩa của ký hiệu 'hàm (số) '. 'System (3)' nghĩa là gì? –
@Seth Carnegie Phần hướng dẫn sử dụng. 'man 3 system'. – cnicutar