免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2375 | 回复: 3
打印 上一主题 下一主题

[SCO UNIX] 急!无名信号灯问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-24 20:06 |只看该作者 |倒序浏览
问题:我有两个进程,父进程创建子进程。两进程之间使用共享内存通信,共享内存使用无名信号灯加锁。代码如下,该代码在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;
}
lxq 该用户已被删除
2 [报告]
发表于 2003-12-28 09:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
lxq 该用户已被删除
3 [报告]
发表于 2003-12-28 16:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2003-12-28 20:49 |只看该作者

急!无名信号灯问题?

我们使用无名信号灯是因为使用了共享内存在多个进程之间通信,通信的内容需要锁机制,并不是只用信号灯,这里给出的仅是示例代码。不使用命名信号灯的原因是因为如果需要大量的信号灯对不同的通信内容加锁,要为每个信号灯取名不方便。我们是在不同的操作系统下开发,如果使用系统V的信号灯集,又带来代码的移植问题。在这种情况下,所以希望使用POSIX标准的无名信号灯。我们的代码在solaris的UNIX下是可以正确执行的,不知为什么Tur64 UNIX下不能正确执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP