- 论坛徽章:
- 0
|
问题:我有两个进程,父进程创建子进程。两进程之间使用共享内存通信,共享内存使用无名信号灯加锁。代码如下,该代码在SUN solaris 2.6 UNIX下正确执行,在Tru64 UNIX 5.1b下子进程无法使用该无名信号灯,错误代码是EINVAL,即“The sem argument does not refer to a valid semaphore”。
由于对Tru64 UNIX 不熟悉,不知问题出在哪里?希望得到您的帮助,谢谢!
/****************************************************************
*semInit.c
*主进程:
* 1.创建共享内存
* 2.创建无名信号灯
* 3.创建一个子进程,在这个子进程中使用所创建的无名信号灯。
****************************************************************/
#include <unistd.h>;
#include <sys/mman.h>;
#include <fcntl.h>;
#include <errno.h>;
#include <string.h>;
#include <signal.h>;
#include <semaphore.h>;
int main()
{
pid_t pid;
int flags = O_RDWR|O_CREAT;
int mode_777 = 0644;
void *shm_ptr;
int shm_fd;
int ret;
sem_t *unnamed_sem ;
/*创建共享内存文件描述符 */
flags |= O_EXCL;
shm_fd = shm_open("SEM_TEST_SHM", flags, mode_777);
if(shm_fd < 0)
{
printf("\nshm_open Failure, error msg is %s", strerror(errno));
return -1;;
}
/* 设定共享内存大小 */
ret = ftruncate(shm_fd, sizeof(sem_t));
if(ret < 0)
{
printf("\n ftruncate Failure !" ;
return -1;
}
/*建立共享内存映射*/
shm_ptr = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
if((caddr_t)shm_ptr == (caddr_t)-1)
{
printf("\n mmap Failure !" ;
return -1;
}
unnamed_sem =(sem_t*)shm_ptr;
/*初始化无名信号灯*/
ret = sem_init(unnamed_sem,1,0);
if(ret != 0)
{
printf("\nunnamed_sem create failed." ;
}
sem_post(unnamed_sem);
printf("semInit unnamed_sem: addr = %x, id = %d",unnamed_sem,*unnamed_sem);
fflush(0);
sleep(1);
/*创建子进程,测试对信号灯的使用情况*/
if((pid = vfork())<0)
{
printf("\nvfork() error" ;
}
else
{
if(pid == 0)
{
if(execl("./SEMUSE","SEMUSE",0,(char*)0)<0)
{
printf("\nexecle error" ;
}
}
}
sleep(1);
shm_unlink("SEM_TEST_SHM" ;
return 0;
}
/****************************************************************
*semUse.c
*子进程:
* 1.映射共享内存
* 2.使用无名信号灯
*
****************************************************************/
#include <unistd.h>;
#include <sys/mman.h>;
#include <fcntl.h>;
#include <errno.h>;
#include <string.h>;
#include <signal.h>;
#include <semaphore.h>;
int main()
{
int flags = O_RDWR|O_CREAT;
int mode_777 = 0644;
void *shm_ptr;
int shm_fd;
int ret;
sem_t *unnamed_sem ; /*无名信号灯*/
/*创建共享内存文件描述符 */
shm_fd = shm_open("SEM_TEST_SHM", flags, mode_777);
if(shm_fd < 0)
{
printf("\nshm_open Failure, error msg is %s", strerror(errno));
return -1;;
}
/* 设定共享内存大小 */
ret = ftruncate(shm_fd, sizeof(sem_t));
if(ret < 0)
{
printf("\n ftruncate Failure !" ;
return -1;
}
/*建立共享内存映射*/
shm_ptr = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
if((caddr_t)shm_ptr == (caddr_t)-1)
{
printf("\n mmap Failure !" ;
return -1;
}
unnamed_sem =(sem_t*)shm_ptr;
printf("\nsemUse unnamed_sem: addr = %x, id = %d",unnamed_sem,*unnamed_sem);
/*使用无名信号灯*/
while (sem_wait(unnamed_sem) == -1)
{
printf("\nsem_wait is error, err_code=%s\n", strerror(errno) );
/* 检查是否由于某个信号中断而造成过早返回*/
if (errno != EINTR)
{
perror("- sem_wait -decrement" ;
shm_unlink("SEM_TEST_SHM" ;
return -1;
}
}
printf("&&&&&&&use unnamed sem OK.\n");
/*释放对临界区的控制*/
sem_post(unnamed_sem);
shm_unlink("SEM_TEST_SHM");
return 0;
} |
|