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

Makale çevirileri Makale çevirileri
Makale numarası: 315939 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

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
}
				

Özellikler

Makale numarası: 315939 - Last Review: 21 Kasım 2006 Salı - Gözden geçirme: 4.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows NT 4.0
Anahtar Kelimeler: 
kbmt kbapi kbkernbase kbprb kbthread KB315939 KbMttr
Machine-translated Article
Ö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

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com