当前位置: 技术问答>linux和unix
solaris 下调用Posix共享内存函数shm_open,shm_unlink问题。
来源: 互联网 发布时间:2015-05-12
本文导语: 调用方式如下: shm_open("/aa", O_RDONLY|O_CREATE|O_EXCL ,S_IRUSR | S_IWUSR);在shmOpen.c中 shm_unlink("/aa");在shmClose.c中 以上两个调用分别在不同的文件里,编译生成2个执行文件: shmOpen shmClose 开始调用了很多次都没问题。 由于其...
调用方式如下:
shm_open("/aa", O_RDONLY|O_CREATE|O_EXCL ,S_IRUSR | S_IWUSR);在shmOpen.c中
shm_unlink("/aa");在shmClose.c中
以上两个调用分别在不同的文件里,编译生成2个执行文件:
shmOpen
shmClose
开始调用了很多次都没问题。
由于其它地方错了,重新编译。
这时,调用shmOpen时,进程执行到shm_open函数就停了,等了大概有2分钟,shm_open返回-1的错误码。
此时error = 4 : Interrupted system call
然后我调用shmClose,进程执行到shm_unlink函数就停了,等了大概有2分钟,shm_open返回-1的错误码。
此时error = 4 : Interrupted system call
此时无论调用哪个函数都如上情况。
只要把程序中的"/aa"替换为其它的名称如"/aaa","abc"等等,程序都正常执行
但是再修改成"/aa"重新编译,依然出现如上情况。也就是说"/aa"这个资源名称不能使用了。
用户换成root也是一样。
谢谢解答!!
代码如下:
shmOpen.c
----------------------------------------
#include
#include
#include
extern int errno;
void main()
{
int i = 0;
i = shm_open("/aa", O_RDWR|O_CREAT|O_EXCL, S_IRUSR | S_IWUSR);
if(i != -1)
{
printf("creat successn");
}
else
{
printf("creat failedn");
}
printf("error is %d:%sn",errno,strerror(errno));
}
--------------------------------------------------
shmClose.c
---------------------------------------------------
#include
#include
extern int errno;
void main()
{
int i = 0;
i = shm_unlink("/export_home1_awing_project_nsstest_src_procpid");
switch(i)
{
case 0:
printf("del successn");
break;
case EACCES:
printf("Permission is denied to unlink the named shared memory object.n");
break;
case ENAMETOOLONG:
printf(" The length of the name string exceeds PATH_MAXn");
break;
case ENOENT:
printf("The named shared memory object does not exist.n");
break;
default:
printf("unkonwn reason fail---%dn",i);
break;
}
printf("error is %d:%sn",errno,strerror(errno));
}
shm_open("/aa", O_RDONLY|O_CREATE|O_EXCL ,S_IRUSR | S_IWUSR);在shmOpen.c中
shm_unlink("/aa");在shmClose.c中
以上两个调用分别在不同的文件里,编译生成2个执行文件:
shmOpen
shmClose
开始调用了很多次都没问题。
由于其它地方错了,重新编译。
这时,调用shmOpen时,进程执行到shm_open函数就停了,等了大概有2分钟,shm_open返回-1的错误码。
此时error = 4 : Interrupted system call
然后我调用shmClose,进程执行到shm_unlink函数就停了,等了大概有2分钟,shm_open返回-1的错误码。
此时error = 4 : Interrupted system call
此时无论调用哪个函数都如上情况。
只要把程序中的"/aa"替换为其它的名称如"/aaa","abc"等等,程序都正常执行
但是再修改成"/aa"重新编译,依然出现如上情况。也就是说"/aa"这个资源名称不能使用了。
用户换成root也是一样。
谢谢解答!!
代码如下:
shmOpen.c
----------------------------------------
#include
#include
#include
extern int errno;
void main()
{
int i = 0;
i = shm_open("/aa", O_RDWR|O_CREAT|O_EXCL, S_IRUSR | S_IWUSR);
if(i != -1)
{
printf("creat successn");
}
else
{
printf("creat failedn");
}
printf("error is %d:%sn",errno,strerror(errno));
}
--------------------------------------------------
shmClose.c
---------------------------------------------------
#include
#include
extern int errno;
void main()
{
int i = 0;
i = shm_unlink("/export_home1_awing_project_nsstest_src_procpid");
switch(i)
{
case 0:
printf("del successn");
break;
case EACCES:
printf("Permission is denied to unlink the named shared memory object.n");
break;
case ENAMETOOLONG:
printf(" The length of the name string exceeds PATH_MAXn");
break;
case ENOENT:
printf("The named shared memory object does not exist.n");
break;
default:
printf("unkonwn reason fail---%dn",i);
break;
}
printf("error is %d:%sn",errno,strerror(errno));
}
|
把/var/tmp/.SHML/aa删掉就可以了。.SHML下的是锁,你的机缘巧合,程序终止时锁没有删除,所以一直被认为是有其他进程正在操作该shm。