VC 双进程保护代码

//test1.cpp

#include <windows.h>

DWORD WINAPI ThreadCheckProc(LPVOID lParam)
{
    STARTUPINFO si={sizeof(si)};
    PROCESS_INFORMATION pi={0};
    HANDLE hMutex;
    char *pName=(char *)lParam;
    while(true)
    {
      hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
      if(!hMutex)
      {
        CreateProcess(pName,
          NULL,
          NULL, // Process handle not inheritable.
          NULL, // Thread handle not inheritable.
          FALSE, // Set handle inheritance to FALSE.
          0, // No creation flags.
          NULL, // Use parent's environment block.
          NULL, // Use parent's starting directory.
          &si, // Pointer to STARTUPINFO structure.
          &pi ); // Pointer to PROCESS_INFORMATION structure.
        WaitForSingleObject( pi.hProcess, INFINITE );
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
      }
      else
      {
        CloseHandle(hMutex);
      }
    Sleep(1);
    }
}

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
    DWORD ThreadId;
    CreateMutex(NULL,TRUE,"test1.exe");
    CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test2.exe",0,&ThreadId);
    while(1)
    {
      Sleep(1000);
    }
    return 0;
}


//test2.cpp

#include <windows.h>

DWORD WINAPI ThreadCheckProc(LPVOID lParam)
{
    STARTUPINFO si={sizeof(si)};
    PROCESS_INFORMATION pi={0};
    HANDLE hMutex;
    char *pName=(char *)lParam;
    while(true)
    {
      hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
      if(!hMutex)
      {
        CreateProcess(pName,
          NULL,
          NULL, // Process handle not inheritable.
          NULL, // Thread handle not inheritable.
          FALSE, // Set handle inheritance to FALSE.
          0, // No creation flags.
          NULL, // Use parent's environment block.
          NULL, // Use parent's starting directory.
          &si, // Pointer to STARTUPINFO structure.
          &pi ); // Pointer to PROCESS_INFORMATION structure.
        WaitForSingleObject( pi.hProcess, INFINITE );
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
      }
      else
      {
        CloseHandle(hMutex);
      }
    Sleep(1);
    }
}

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
    DWORD ThreadId;
    CreateMutex(NULL,TRUE,"test2.exe");
    CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test1.exe",0,&ThreadId);
    while(1)
    {
      Sleep(1000);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 进程的互斥是一种保证多个进程在访问共享资源时不会发生冲突的方法。在VC6.0中,我们可以使用互斥对象来实现进程的互斥。 首先,我们需要定义一个互斥对象。在VC6.0中,可以使用CreateMutex函数来创建一个互斥对象。例如: HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex"); 其中,第一个参数为一个LPSECURITY_ATTRIBUTES指针,用于指定互斥对象的安全属性,一般设为NULL即可;第二个参数为BOOL类型的初始状态,一般设为FALSE;第三个参数为一个LPCTSTR类型的字符串,用于指定互斥对象的名称。 接下来,我们可以使用WaitForSingleObject函数来等待互斥对象。例如: DWORD dwWaitResult = WaitForSingleObject(hMutex, INFINITE); 其中,第一个参数为互斥对象的句柄;第二个参数为等待的时间,INFINITE表示无限等待。 如果返回值为WAIT_OBJECT_0,表示成功获取到互斥对象,可以继续访问共享资源。否则,表示等待超时或出现错误。 最后,我们使用ReleaseMutex函数来释放互斥对象。例如: BOOL bReleaseResult = ReleaseMutex(hMutex); 其中,参数为互斥对象的句柄。 通过这样的方式,我们可以在多个进程之间实现资源的互斥访问,避免了数据的冲突和竞争条件的出现。 ### 回答2: 进程的互斥是指确保在多进程环境下同时只有一个进程可以访问临界资源(如共享内存、文件等),以避免数据竞争和不一致的问题。 在VC6.0中,可以通过使用Windows API函数来实现进程的互斥。以下是一个示例代码: ```cpp #include <windows.h> int main() { // 创建一个互斥对象 HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex"); // 检查互斥对象是否已经存在 if (ERROR_ALREADY_EXISTS == GetLastError()) { // 如果互斥对象已经存在,说明已有进程正在访问临界资源,直接退出程序 return 0; } // 这里是临界区代码,对共享资源的访问操作 // 在访问完共享资源后,释放互斥对象 ReleaseMutex(hMutex); // 关闭互斥对象的句柄 CloseHandle(hMutex); return 0; } ``` 在上面的代码中,首先使用`CreateMutex`函数创建了一个名为"MyMutex"的互斥对象。如果互斥对象已经存在(即其他进程已经创建了该互斥对象),则直接退出程序。 如果进程是第一个创建该互斥对象的进程,那么就可以执行临界区代码,对共享资源进行访问。在访问完共享资源后,通过调用`ReleaseMutex`函数来释放该互斥对象。 最后,需要关闭互斥对象的句柄,以释放资源。 这样,通过使用互斥对象,确保了在多进程环境下只有一个进程能够访问临界资源,实现了进程的互斥。 ### 回答3: 进程的互斥是指在多个进程同时访问共享资源时,通过互斥机制保证同一时间只有一个进程能够访问该资源。下面是一个用VC6.0编写的进程互斥的示例代码: ```cpp #include <windows.h> int main() { HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex"); // 创建一个互斥体 if (hMutex == NULL) { // 互斥体创建失败,处理错误 return 1; } // 在使用共享资源之前,请求互斥体的所有权 WaitForSingleObject(hMutex, INFINITE); // 访问共享资源的代码 // ... // 使用完共享资源后,释放互斥体的所有权 ReleaseMutex(hMutex); CloseHandle(hMutex); // 关闭互斥体句柄 return 0; } ``` 在这段代码中,通过CreateMutex函数创建了一个名为"Mutex"的互斥体,并将其句柄保存到hMutex变量中。然后使用WaitForSingleObject函数请求互斥体的所有权,这样如果有其他进程正在访问该互斥体,当前进程会被阻塞直到其它进程释放该互斥体。在获取到互斥体的所有权后,可以进行对共享资源的访问操作。完成共享资源的使用后,通过调用ReleaseMutex函数释放互斥体的所有权。 最后,通过CloseHandle函数关闭互斥体的句柄,释放相关资源。 这段代码的作用是通过互斥体实现了对共享资源的互斥访问,保证同一时间只有一个进程能够访问该资源,从而避免了进程间的竞争和冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值