一个存在的Semaphore,另一个进程用OpenSemaphore打开失败,但用CreateSemaphore却打开成功,为什么?

rcbblgy 2010-08-30 04:40:59
两个都是控制台程序,一个进程创建了一个信号量后,再启动另外一个进程
下面是代码

HANDLE hSemaphore = CreateSemaphore(NULL, 0, 2, _T("rcbblgy"));

TCHAR pszCmd[] = _T("testProcess.exe");
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(STARTUPINFO)};
CreateProcess(NULL, pszCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);


testProcess.exe里的代码如下:

HANDLE hSemaphore = OpenSemaphore(NULL, FALSE, _T("rcbblgy"));
//GetLastError()返回ERROR_ACCESS_DENIED



HANDLE hSemaphore = CreateSemaphore(0, 0, 4, _T("rcbblgy"));
//GetLastError()返回ERROR_ALREADY_EXISTS


哪里有问题,如何让OpenSemaphore也能打开存在的信号量?

系统是WIN7,是不是权限的问题?
...全文
927 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
老断 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xyzhaopeng 的回复:]
semaphore object只能在同一个进程之间使用。
[/Quote]
信号量可以跨进程使用, 需要设置名字。
rcbblgy 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xxd_qd 的回复:]
原因7楼不是已经给你写出来了吗?OpenSemaphore的第一个参数dwDesiredAccess是你打开时所要求的权限,你传个NULL进去是什么意思?什么权限都不要?那还怎么打开?
[/Quote]
不好意思,漏掉了,没看到7楼
wltg2001 2010-08-30
  • 打赏
  • 举报
回复
testProcess.exe里的代码如下:
C/C++ code
HANDLE hSemaphore = OpenSemaphore(NULL, FALSE, _T("rcbblgy"));
//GetLastError()返回ERROR_ACCESS_DENIED
========================
第一个参数不能设为NULL啊,改为:
HANDLE hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, _T("rcbblgy"));
xxd_qd 2010-08-30
  • 打赏
  • 举报
回复
原因7楼不是已经给你写出来了吗?OpenSemaphore的第一个参数dwDesiredAccess是你打开时所要求的权限,你传个NULL进去是什么意思?什么权限都不要?那还怎么打开?
liyinlei 2010-08-30
  • 打赏
  • 举报
回复
GetLastError 得到什么错误码

HANDLE hSemaphore = OpenSemaphore(SEMAPHORE_MODIFY_STATE, FALSE, _T("Global\\rcbblgy"));
rcbblgy 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 liyinlei 的回复:]
CreateSemaphore(NULL, 0, 2, _T("Global\\rcbblgy"));
Create的时候也加上Global。

另外程序用管理员用户身份运行。
[/Quote]
试了,还是不行
liyinlei 2010-08-30
  • 打赏
  • 举报
回复
CreateSemaphore(NULL, 0, 2, _T("Global\\rcbblgy"));
Create的时候也加上Global。

另外程序用管理员用户身份运行。

cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
semaphore object也可以用于多进程。
特此更正。(xxd_qd)是对的。
cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xxd_qd 的回复:]

除了CriticalSection之外,其它的各种Synchronization Objects都可以在进程间使用。

Create一个Synchronization Objects的时候,如果该Synchronization Objects不存在则创建,如果存在则打开。因此一般来说不需要用到Open。当Create一个已存在的Synchronization Objects的时候,只要能成功……
[/Quote]
汗,等下我试试看。我一直认为只有Mutex和Event是多进程之间的线程同步对象。
xxd_qd 2010-08-30
  • 打赏
  • 举报
回复
除了CriticalSection之外,其它的各种Synchronization Objects都可以在进程间使用。

Create一个Synchronization Objects的时候,如果该Synchronization Objects不存在则创建,如果存在则打开。因此一般来说不需要用到Open。当Create一个已存在的Synchronization Objects的时候,只要能成功打开,Create将返回一个正确的HANDLE,但此时GetLastError却返回ERROR_ALREADY_EXISTS
。这样做的目的仅仅是让调用者能通过这种方式知道这个Synchronization Objects已经存在,并不影响所返回的HANDLE的使用。如果Create确实失败的话,返回值将是NULL。
cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rcbblgy 的回复:]

引用 3 楼 xyzhaopeng 的回复:
Event可以在多个进程之间使用。

我测试过,event也一样,不过好像之前在xp测试多进程event同步时,是可以的

semaphore不能在多进程间使用?那为什么第二个进程用CreateSemaphore打开时,会返回一个有效有句柄呢?
[/Quote]
Create是创建,自然可以成功。
xxd_qd 2010-08-30
  • 打赏
  • 举报
回复
HANDLE hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, _T("rcbblgy"));
rcbblgy 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liyinlei 的回复:]
HANDLE hSemaphore = OpenSemaphore(NULL, FALSE, _T("Global\\rcbblgy"));
[/Quote]
也一样会提示Access is Denied
rcbblgy 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xyzhaopeng 的回复:]
Event可以在多个进程之间使用。
[/Quote]
我测试过,event也一样,不过好像之前在xp测试多进程event同步时,是可以的

semaphore不能在多进程间使用?那为什么第二个进程用CreateSemaphore打开时,会返回一个有效有句柄呢?
cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
To determine which synchronization class you should use, ask the following series of questions:

1. Does the application have to wait for something to happen before it can access the resource (for example, data must be received from a communications port before it can be written to a file)?
If yes, use CEvent.

2. Can more than one thread within the same application access this resource at one time (for example, your application allows up to five windows with views on the same document)?
If yes, use CSemaphore.

3. Can more than one application use this resource (for example, the resource is in a DLL)?
If yes, use CMutex.

If no, use CCriticalSection.

CSyncObject is never used directly. It is the base class for the other four synchronization classes.
cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
Event可以在多个进程之间使用。
cdsnpeter 2010-08-30
  • 打赏
  • 举报
回复
semaphore object只能在同一个进程之间使用。
liyinlei 2010-08-30
  • 打赏
  • 举报
回复
HANDLE hSemaphore = OpenSemaphore(NULL, FALSE, _T("Global\\rcbblgy"));

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧