Şu anda çevrimdışısınız; İnternet'in yeniden bağlanması bekleniyor

SORUN: Alt istenmeyen tanıtıcıları CreateProcess çağrı sırasında devralır

ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.

Makalenin İngilizcesi aşağıdaki gibidir:315939
Belirtiler
Bir alt işlem oluştururken CreateProcess</a1> işlevini kullanarak, bir çok iş parçacıklı ortamda arama, alt devralınmasını hedeflenmemiş tanıtıcıları devralmak.
Neden
Alt işlemleri oluşturmak ve kanallar aracılığıyla STDSAPMA tanıtıcıları yeniden yönlendirme aynı anda iki iş parçacığı Bu davranış oluşabilir. Bu senaryoda, olduğu bir yarış durumu ve yöneltme işlemleri, diğer alt düzey için tasarlanmış dosya tanıtıcıları devralmak bir alt mümkün olduğu oluşturulması sırasında. Bir iş parçacığının yöneltme oluşturur ve bu iş parçacığının işlem oluşturma sürecinde olmakla birlikte, diğer iş parçacığının bir alt işlemi de oluşturuyor. CreateProcess çağrısı sırasında uygulamasında devralınabilir tüm tanıtıcısı varsayılan olarak, alt işlemi boyunca çoğaltılır.
Çözüm
Bu soruna geçici bir çözüm bulmak için <a0></a0>, önemli bir bölümü oluşturma alt kod alın. Bu, herhangi bir istem dışı devralma engeller. Düzgün çalışması bu yöntemi, NULL'A güvenlik tanımlayıcısını ayarlayarak, noninheritable olarak yöneltme oluşturun. Ardından alt devralınabilir SetHandleInformation işlev çağrısı, Ek Yardım düğmesini kullanarak aşağıdaki örnek kodda gösterildiği gibi devralmak istediğiniz kanal ucunun ayarlayın:
CRITICAL_SECTION    cs;HANDLE              hReadIn, hWriteIn;HANDLE              hReadOut, hWriteOut;HANDLE              hReadErr, hWriteErr;InitializeCriticalSection(&cs);EnterCriticalSection(&cs);if ( !CreatePipe(&hReadIn, &hWriteIn, NULL, 0) ){    // an error occurred}if ( !CreatePipe(&hReadOut, &hWriteOut, NULL, 0) ){    // an error occurred}if ( !CreatePipe(&hReadErr, &hWriteErr, NULL, 0) ){    // an error occurred}if ( !SetHandleInformation(hReadIn, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT) ){    // an error occurred}if ( !SetHandleInformation(hWriteOut, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT) ){    // an error occurred}if ( !SetHandleInformation(hWriteErr, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT) ){    // an error occurred}STARTUP_INFO        si;PROCESS_INFORMATION pi;si.cb = sizeof(si);si.dwFlags = STARTF_USESTDHANDLES;si.hStdInput = hReadIn;si.hStdOutput = hWriteOut;si.hStdError = hWriteErr;if ( !CreateProcess( "child.exe",                     NULL,                     NULL, NULL,                     TRUE,                     NORMAL_PRIORITY_CLASS,                     lpEnvironment,                     &si, &pi) ){    // an error occurred}CloseHandle(hReadIn);CloseHandle(hWriteOut);CloseHandle(hWriteErr);LeaveCriticalSection(&cs);				
Not Yukarıdaki çözüm maliyetleri gelir. Kritik bölüm kodu oluşturulmasını bazen karmakarışık, azaltılmış performans fiyatla gelir. Bu sorun, başka bir geçici çözüm vardır ve alt başlatmak için Ara uygulamaya oluşturulmasını gerektirir. Ancak, bu çözüm, downside de vardır. Bu yöntemin ana olumsuz yanı, üst temelde, çocuğun işlem KIMLIğI ile aldığı kolay kaybettiğinde olan Üst işlem KIMLIĞI gerekiyorsa, ara işlem bunu geri şekilde geçmelidir.

Bu ara uygulama yöntemini kullanarak, herhangi bir istem dışı devralma işi sizin yerinize yapacak Windows güvenmek zorunda kaçının. Ara işlemindeki yanlışlıkla devralınan tüm tanıtıcıları kesinlikle üzerinden alt için çoğaltılacak değil. Bu, ara uygulamadaki CreateProcess çağrısında bInheritHandles parametresi için YANLıŞ belirttiğiniz sağlanır. Hatta bInheritHandles FALSE olarak ayarlandığında Windows her zaman, STDSAPMA tutamaçları çoğaltmak için kanal tanıtıcısı hala çoğaltılır.

Ana uygulama

HANDLE              hReadIn, hWriteIn;HANDLE              hReadOut, hWriteOut;HANDLE              hReadErr, hWriteErr;if ( !CreatePipe(&hReadIn, &hWriteIn, NULL, 0) ){    // an error occurred}if ( !CreatePipe(&hReadOut, &hWriteOut, NULL, 0) ){    // an error occurred}if ( !CreatePipe(&hReadErr, &hWriteErr, NULL, 0) ){    // an error occurred}STARTUP_INFO        si;PROCESS_INFORMATION pi;si.cb = sizeof(si);si.dwFlags = STARTF_USESTDHANDLES;si.hStdInput = hReadIn;si.hStdOutput = hWriteOut;si.hStdError = hWriteErr;if ( !CreateProcess( "Intermediate.exe",                     NULL,                     NULL, NULL,                     TRUE,                     NORMAL_PRIORITY_CLASS,                     lpEnvironment,                     &si, &pi) ){    // an error occurred}CloseHandle(hReadIn);CloseHandle(hWriteOut);CloseHandle(hWriteErr);				

Ara uygulama

STARTUP_INFO        si;PROCESS_INFORMATION pi;si.cb = sizeof(si);if ( !CreateProcess( "child.exe",                     NULL,                     NULL, NULL,                     FALSE,                     NORMAL_PRIORITY_CLASS,                     lpEnvironment,                     &si, &pi) ){    // an error occurred}				

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 315939 - Son İnceleme: 11/21/2006 15:37:38 - Düzeltme: 4.1

Microsoft Win32 Uygulama Programlama Arabirimi

  • kbmt kbapi kbkernbase kbprb kbthread KB315939 KbMttr
Geri bildirim