Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Tcl fileevent挂起在64位版本的Tcl上_C++_Linux_Tcl_64 Bit_X11 - Fatal编程技术网

C++ Tcl fileevent挂起在64位版本的Tcl上

C++ Tcl fileevent挂起在64位版本的Tcl上,c++,linux,tcl,64-bit,x11,C++,Linux,Tcl,64 Bit,X11,我在Linux上使用64位8.4.3 Tcl非线程,我面临一种奇怪的行为 我的C++应用程序有一个定时器,它使用 xtAppPro程序> < />代码执行一些XT处理程序。其中一个处理程序调用Tcl\u DoOneEvent 我有一个Tcl脚本,它打开一个空管道并将一个fileevent附加到打开的通道 set jobId [open "| "] fileevent $jobId readable 这要做多次。当通道名称为file35时,工具会挂起。使用调试版本的Tcl库。这表明在执行以下部分

我在Linux上使用64位8.4.3 Tcl非线程,我面临一种奇怪的行为

<>我的C++应用程序有一个定时器,它使用<代码> xtAppPro程序> < />代码执行一些XT处理程序。其中一个处理程序调用
Tcl\u DoOneEvent

我有一个Tcl脚本,它打开一个空管道并将一个fileevent附加到打开的通道

set jobId [open "| "]
fileevent $jobId readable
这要做多次。当通道名称为
file35
时,工具会挂起。使用调试版本的Tcl库。这表明在执行以下部分后,就绪任务[0]始终为0:

// tclUnixNotfy.c:772
numFound = select(tsdPtr->numFdBits,
    (SELECT_MASK *) &tsdPtr->readyMasks[0],
    (SELECT_MASK *) &tsdPtr->readyMasks[MASK_SIZE],
    (SELECT_MASK *) &tsdPtr->readyMasks[2*MASK_SIZE], timeoutPtr);
输入检查掩码为72(1001000)


这里是奇怪的部分:

当我到达工具挂起的部分时,如果我打开一个新的shell选项卡,该工具将不再挂起,并按预期继续执行。当新的shell选项卡打开时,
readymask
将变为72

该工具在32位时运行正常。我无法将发生的事情与64位联系起来


我在redhat 5、6和7上试过,没有任何区别。

因此,我找到了问题所在

问题基本上是由于移位的是
整数
,而不是
。Tcl中的这项工作在
tclUnixChan.c
中完成,同时在
tsdPtr->checkMasks>中计算需要修改的索引和位:

index = fd/(NBBY*sizeof(fd_mask)); 
bit = 1 << (fd%(NBBY*sizeof(fd_mask)));
strace
当我打开一个新的shell选项卡时,输出更改为:

poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 2, 0) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "X\1\366\371\264\300\7=\3\0\22\0\10\377\0\0\26\1\26\1\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 0, NULL, NULL) = 256
recvfrom(4, 0x80e21f4, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(4, 0x80e21f4, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 2, 0) = 0 (Timeout)
recvfrom(6, "X\1\321/\264\300\7=\3\0\22\0\10\377\0\0\26\1\26\1\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 0, NULL, NULL) = 256
recvfrom(6, 0x8380d64, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
select(36, [3 6], [], [], {0, 0})       = 1 (in [3], left {0, 0})
recvfrom(6, 0x8380d64, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
read(35, "", 4096)                      = 0
close(35)                               = 0
lsof
输出显示通道
4
6
的以下内容:

myexec 13626 aymansalah    4u  IPv4 1607796326       0t0        TCP rhe6x64:38787->nx-svr:7016 (ESTABLISHED)
myexec 13626 aymansalah    6u  IPv4 1607837231       0t0        TCP rhe6x64:38788->nx-svr:7016 (ESTABLISHED)
通道
4
6
是将我的机器连接到NX服务器的通道


参考资料:


您能试用8.6.9吗?8.6.3现在是一个相当老的点释放。还有,打开一个空管道?!那到底是怎么回事?我不知道它曾经起过作用……但它不应该起作用。当我尝试时,我得到一个“
非法使用|或|&in命令”
”。@DonalFellows我尝试升级到
8.6.6
,但一切都坏了。应用程序是巨大的,这样的升级并不是那么简单。它确实有效我是100%我的应用程序使用它很多。至于使用它的原因,它用于计划在下一个
Tcl_DoOneEvent
上处理的事件。通过这种方式执行一些
Xt
事件以保持用户界面的响应。我知道8.6.x中最近对通道进行了更改,其中使用了
poll
而不是
select
。虽然我的工具严重依赖Tcl,但我无法进行如此大规模的升级。OP上说的是8.4.3,而不是8.6.3(但这似乎已经改变了)?
myexec 13626 aymansalah    4u  IPv4 1607796326       0t0        TCP rhe6x64:38787->nx-svr:7016 (ESTABLISHED)
myexec 13626 aymansalah    6u  IPv4 1607837231       0t0        TCP rhe6x64:38788->nx-svr:7016 (ESTABLISHED)