Я программирую на C, используя API win32.
Моя программа начинается с void main , я выполняю какое-то действие, которое создает мьютекс с определенным именем, а затем запускаю для него функцию waitForSingleObject с параметром времени INFINITE.
Затем я запускаю EXE-процесс с помощью функции createProcess.
Процесс EXE имеет аналогичный код, который теперь выполняет createMutex с тем же именем, что и раньше с родительским процессом.
Насколько я понимаю, я должен получить дескриптор того же мьютекса, который я создал в родительской программе, потому что он имеет то же имя. Поэтому после этого EXE-код также снова выполняет функцию WaitForSingleObject для дескриптора мьютекса с теми же параметрами.
Я ожидал, что это остановится и подождет сейчас, но это продолжалось, поскольку это было каким-то образом сигнализировано, но я никак не мог подать сигнал где-либо на этом этапе.
Я попытался заменить параметр INFINITE на 0 и посмотреть, получу ли я WAIT_TIMEOUT, но и это не сработало.
Почему мой мьютекс не работает?
Спасибо
добавлен соответствующий код: (я пытался поместить только то, что имеет значение) * обратите внимание, что EXE-файл Process1 содержит код, который делает openfileInDirectory с тем же именем файла, что и в void main и для записи. ** Мой мьютекс называется writeMutex. FileSystemMutex — еще один, который не имеет ничего общего с моей текущей проблемой.
// Global variables definition from library header
void* viewVec;
HANDLE fileHandle;
int directoryLastBlockIndex;
FilesInProcessUse processFiles;
HANDLE fileSystemMutex;
HANDLE filesAccessSemaphore;
void main()
{
FileDescriptor* fd, *fd2;
int message,message2,message3;
int processId = GetCurrentProcessId();
char* input= NULL;
/* print out our process ID */
printf("Process %d reporting for duty\n",processId);
fileSystemMutex = CreateMutex(NULL,FALSE,FILE_SYSTEM_MUTEX_NAME);
printf("Process %d: After creating fileSystem mutex\n",processId);
filesAccessSemaphore = CreateSemaphore(NULL,MAX_ACCESSORS_FOR_ALL_FILES,MAX_ACCESSORS_FOR_ALL_FILES,FILE_SYSTEM_SEMAPHORE_NAME);
printf("Process %d: After creating filesAccessSemaphore\n",processId);
initfs("C",NUM_OF_BLOCKS_IN_DISK,NUM_OF_BLOCKS_IN_DISK);
viewVec = attachfs("C"); // Saving the address of the vector in global pointer.
if(viewVec!=NULL)
{
printf("Process %d: After AttachFS which succeded\n",processId);
fd = (FileDescriptor*) createFileInDirectory("FileX",2,&message);
if (fd!=NULL)
{
printf("Process %d:successfuly created the file: FileX in Drive C\n",processId);
}
else
{
printErrMessage(message);
}
}
else
{
printf("Process %d: After AttachFS, which failed\n",processId);
}
fd = (FileDescriptor*) openFileInDirectory("FileX",READ_PERMISSION,&message);
if(fd!=NULL)
{
printf("Process %d: opened FileXfile for read succefully",processId);
}
else
{
printf("Process %d:",processId);
printErrMessage(message);
}
closeFileInDirectory(fd);
fd = (FileDescriptor*) openFileInDirectory("FileX",WRITE_PERMISSION,&message);
if(fd!=NULL)
{
printf("Process %d: opened FileXfile for write succefully",processId);
}
else
{
printf("Process %d:",processId);
printErrMessage(message);
}
fd2 = (FileDescriptor*) openFileInDirectory("FileX",WRITE_PERMISSION,&message);
if(fd!=NULL)
{
printf("Process %d: opened FileX file for write succefully",processId);
}
else
{
printf("Process %d:",processId);
printErrMessage(message);
}
}
}
void* openFileInDirectory(char* fileName, int ReadWriteFlag, int* out_ErrMessage)
{
SystemInfoSection* sysInfo = readSystemInformationFromBeginingOfVector((char*)viewVec);
DirectoryEntry* fileEntryInDirOffset;
FileDescriptor* openfileDescriptor = NULL;
int fileIndexInOpenFiles = 0;
int writeRV;
//Mark that another file is being processed
WaitForSingleObject(filesAccessSemaphore,INFINITE);
//Check if the file exists else return error
if(isFileAlreadyExisting(fileName, sysInfo->directoryStartBlockIndex, &fileEntryInDirOffset))
{
fileIndexInOpenFiles = getFileIndexInOpenFileDirectory(fileName);
processFiles.allFilesVector[fileIndexInOpenFiles].accessSemaphore = CreateSemaphore(NULL,MAX_FILE_ACCESSORS,MAX_FILE_ACCESSORS,fileName);
WaitForSingleObject(processFiles.allFilesVector[fileIndexInOpenFiles].accessSemaphore,INFINITE);
if (ReadWriteFlag == WRITE_PERMISSION)
{
char writeMutexName[15];
strcpy(writeMutexName, WRITE_MUTEX_PREFIX);
strcat(writeMutexName, fileName);
processFiles.allFilesVector[fileIndexInOpenFiles].writeMutex = CreateMutex(NULL,FALSE,writeMutexName);
WaitForSingleObject(processFiles.allFilesVector[fileIndexInOpenFiles].writeMutex,INFINITE);
//writeRV = WaitForSingleObject(processFiles.allFilesVector[fileIndexInOpenFiles].writeMutex,MAX_WAIT_TIMEOUT_IN_FS);
//if(writeRV == WAIT_TIMEOUT)
//{
// ReleaseSemaphore(processFiles.allFilesVector[fileIndexInOpenFiles].accessSemaphore,1,NULL);
// //return error indicating that another process is already writing to the file AND RETURN FROM THE FUNCTION
// *out_ErrMessage = ERR_FILE_IS_ALREADY_OPEN_TO_A_WRITE_BY_SOME_PROCESS;
// return openfileDescriptor;
//}
}
processFiles.FDInProcessUseVector[fileIndexInOpenFiles].fileDirectoryEntry = fileEntryInDirOffset;
processFiles.FDInProcessUseVector[fileIndexInOpenFiles].readWriteFlag = ReadWriteFlag;
openfileDescriptor = &(processFiles.FDInProcessUseVector[fileIndexInOpenFiles]);
processFiles.numOfFilesInUse++;
}
else
{
openfileDescriptor = NULL;
*out_ErrMessage = ERR_FILE_NOT_FOUND;
}
free(sysInfo);
return openfileDescriptor;
}
ERROR_ALREADY_EXISTS
, как ожидалось? - person Ben Voigt   schedule 07.02.2012openFileInDirectory
, у вас есть это как:processFiles.allFilesVector[fileIndexInOpenFiles].writeMutex
, а вызов ожидания:WaitForSingleObject(processFiles.allFilesVector[fileIndexInOpenFiles].writeMutex,INFINITE);
- person JavaSa   schedule 07.02.2012bInitialOwner
установлено значениеFALSE
. - person Ben Voigt   schedule 07.02.2012CreateMutex
, а другой процесс вызываетCreateMutex
сразу после него, другой процесс может получить дескриптор этого мьютекса, а также права собственности, вызвавWaitForSingleObject
до того, как первый процесс вызоветWaitForSingleObject
. - person LihO   schedule 07.02.2012