免费注册 查看新帖 |

Chinaunix

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

多进程多进程与信号量问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-09 15:55 |只看该作者 |倒序浏览
我写了一个生产者程序,一个消费者程序,然后主进程execv出来三个生产者进程,三个消费者进程。但是不太稳定,有时候消费者进程总不能退出
a wrong operation to semaphore occurred!: Invalid argument
还产生以上的错误,高手帮忙看看。
代码如下:
主程序:
#include"sharemem.h"
#define ARR_SIZE 20

int
main ()
{
    //创建并初始化信号量

    int emptyid, fullid, mutex;
    if (((emptyid = createsem (".", 'e', 1, B_SIZE)) == -1)
      || ((fullid = createsem (".", 'f', 1, 0)) == -1)
      || ((mutex = createsem (".", 'u', 1, 1)) == -1))
    exit (1);
    //创建共享内存

    char *array, *set, *get;
    int arrid, setid, getid;
    arrid = createshm (".", 'h', sizeof (int) * ARR_SIZE);
    array = shmat (arrid, NULL, 0666);
    setid = createshm (".", 's', B_SIZE);
    set = shmat (setid, NULL, 0666);
    getid = createshm (".", 'g', B_SIZE);
    get = shmat (getid, NULL, 0666);
    (*set) = 1;
    (*get) = 1;
    printf ("size1 %d  \n", sizeof (int) * ARR_SIZE);
    //创建子进程

    int i, j;
    printf ("请输入要创建生产者进程的个数:\n");
    scanf ("%d", &i);
    printf ("请输入要创建消费者进程的个数:\n");
    scanf ("%d", &j);
    int tempi, tempj;
    int chld;
    int producer[i], sumer[j];
    for (tempi = 0; tempi < i; tempi++)
    {
        chld = vfork ();
        if (chld == 0)
            execv ("producer", NULL);
        else
        {
            producer[tempi] = chld;
            printf ("这是producer主进程,产生生产者进程 %d \n", chld);
        }
    }
    for (tempj = 0; tempj < j; tempj++)
    {
        chld = vfork ();
        if (chld == 0)
            execv ("sumer", NULL);
        else
        {
            sumer[tempj] = chld;
            printf ("这是sumer主进程,产生消费者进程 %d \n", chld);
        }
   
    int k;

    for(k = 0; k < 6; k++)
    {
        k = wait (0);
        printf("进程 %d 退出\n", k);
    }
    sleep (2);
    printf ("子进程结束\n");
    //关闭共享内存,信号量

    shmdt (array);
    shmdt (set);
    shmdt (get);
    shmctl (arrid, IPC_RMID, 0);
    shmctl (setid, IPC_RMID, 0);
    shmctl (getid, IPC_RMID, 0);
    semctl (emptyid, IPC_RMID, 0);
    semctl (fullid, IPC_RMID, 0);
    semctl (mutex, IPC_RMID, 0);
    printf ("父进程结束\n");
    exit (0);
}

论坛徽章:
0
2 [报告]
发表于 2008-12-09 15:57 |只看该作者
生产者:
#include "sharemem.h"
#include <syslog.h>

#define B_SIZE 20

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;//打开信号量

&nbsp;&nbsp;&nbsp;&nbsp;int emptyid, fullid, mutex;
&nbsp;&nbsp;&nbsp;&nbsp;if ( ((emptyid = opensem(".", 'e')) == -1) || ((fullid = opensem(".", 'f')) == -1) || ((mutex = opensem(".", 'u')) == -1) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//打开共享内存

&nbsp;&nbsp;&nbsp;&nbsp;char *array, *set;
&nbsp;&nbsp;&nbsp;&nbsp;int arrid, setid;
&nbsp;&nbsp;&nbsp;&nbsp;arrid = createshm(".", 'h', 0);
&nbsp;&nbsp;&nbsp;&nbsp;array = shmat(arrid, NULL, 0666);
&nbsp;&nbsp;&nbsp;&nbsp;setid = createshm(".", 's', 0);
&nbsp;&nbsp;&nbsp;&nbsp;set = shmat(setid, NULL, 0666);
&nbsp;&nbsp;&nbsp;&nbsp;int temp = 0;
&nbsp;&nbsp;&nbsp;&nbsp;//向共享内存写数据

&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sleep(2);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_p(emptyid, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_p(mutex, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((*set) > 20)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(array[(*set) % B_SIZE] == 21)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[(*set) % B_SIZE] = (*set) % B_SIZE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[(*set) % B_SIZE] = (*set) % B_SIZE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syslog(LOG_USER|LOG_INFO, "生产者进程 %d 向数组 %d 中写入%d\n", getpid(), (*set) % B_SIZE, array[(*set) % B_SIZE]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*set)++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((*set) >= 25)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syslog(LOG_USER|LOG_INFO, "生产者进程 %d 退出\n", getpid());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_v(mutex, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_v(fullid, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp == 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
}


消费者:
#include"sharemem.h"
#include <syslog.h>

#define B_SIZE 20

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;//打开信号量

&nbsp;&nbsp;&nbsp;&nbsp;int emptyid, fullid, mutex;
&nbsp;&nbsp;&nbsp;&nbsp;if ( ((emptyid = opensem(".", 'e')) == -1) || ((fullid = opensem(".", 'f')) == -1) || ((mutex = opensem(".", 'u')) == -1) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//打开共享内存

&nbsp;&nbsp;&nbsp;&nbsp;char *array, *get;
&nbsp;&nbsp;&nbsp;&nbsp;int arrid, getid;
&nbsp;&nbsp;&nbsp;&nbsp;arrid = createshm(".", 'h', 0);
&nbsp;&nbsp;&nbsp;&nbsp;array = shmat(arrid, NULL, 0666);
&nbsp;&nbsp;&nbsp;&nbsp;getid = createshm(".", 'g', 0);
&nbsp;&nbsp;&nbsp;&nbsp;get = shmat(getid, NULL, 0666);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;int temp = 0;
&nbsp;&nbsp;&nbsp;&nbsp;//从共享内存中读数据

&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sleep(6);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_p(fullid, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_p(mutex, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( array[(*get) % B_SIZE] != 21)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syslog(LOG_USER|LOG_INFO, "消费者进程 %d 从数组 %d 中取出%d\n", getpid(), (*get) % B_SIZE, array[(*get) % B_SIZE]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[(*get) % B_SIZE] = 21;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*get)++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((*get) >= 25)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syslog(LOG_USER|LOG_INFO, "消费者进程 %d 退出\n", getpid());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_v(mutex, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_v(emptyid, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp == 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
}

论坛徽章:
0
3 [报告]
发表于 2008-12-09 15:58 |只看该作者
头文件:
#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

#include <errno.h>



#define B_SIZE 20



union semun{

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;                val;

&nbsp;&nbsp;&nbsp;&nbsp;struct semid_ds *buf;

&nbsp;&nbsp;&nbsp;&nbsp;unsigned short  *array;

};





int createsem (const char * pathname,  int proj_id,  int members,  int init_val)

{

&nbsp;&nbsp;&nbsp;&nbsp;key_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msgkey;

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index,  sid;

&nbsp;&nbsp;&nbsp;&nbsp;union semun&nbsp;&nbsp;&nbsp;&nbsp;semopts;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;if ((msgkey = ftok(pathname, proj_id)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("ftok error!\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;if ((sid = semget (msgkey, members, IPC_CREAT | 0666)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("semget call failed.\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;semopts.val = init_val;

&nbsp;&nbsp;&nbsp;&nbsp;for (index = 0; index < members; index++)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;semctl (sid, index, SETVAL, semopts);

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return (sid);

}



int opensem(const char * pathname, int proj_id)

{

&nbsp;&nbsp;&nbsp;&nbsp;key_t&nbsp;&nbsp;&nbsp;&nbsp;msgkey;

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;sid;         

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((msgkey = ftok(pathname, proj_id)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("ftok error!\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;if ((sid = semget(msgkey, 0, IPC_CREAT | 0666)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("semget call failed.\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;return (sid);

}





int sem_p(int semid, int index)

{

&nbsp;&nbsp;&nbsp;&nbsp;//index表示信号量集中那个信号量


&nbsp;&nbsp;&nbsp;&nbsp;struct sembuf buf = {0,-1,SEM_UNDO};



&nbsp;&nbsp;&nbsp;&nbsp;if (index < 0)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("index of array cannot equals a minus value!");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;buf.sem_num = index;

&nbsp;&nbsp;&nbsp;&nbsp;if (semop (semid ,&buf,1) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("a wrong operation to semaphore occurred!");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;

}



int sem_v (int semid, int index)

{

&nbsp;&nbsp;&nbsp;&nbsp;struct sembuf buf = {0, 1, SEM_UNDO};



&nbsp;&nbsp;&nbsp;&nbsp;if (index < 0)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("index of array cannot equals a minus value!");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;buf.sem_num = index;

&nbsp;&nbsp;&nbsp;&nbsp;if (semop (semid,&buf,1) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("a wrong operation to semaphore occurred!");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;return 0;

}





int sem_delete (int semid)

{

&nbsp;&nbsp;&nbsp;&nbsp;return (semctl(semid, 0, IPC_RMID));

}





int wait_sem( int semid, int index)

{

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;while (semctl (semid, index, GETVAL, 0) == 0)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep (1);

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;return 1 ;

}




int createshm(char * pathname, int proj_id, size_t size)

{

&nbsp;&nbsp;&nbsp;&nbsp;key_t&nbsp;&nbsp;&nbsp;&nbsp;shmkey;

&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sid;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;if ((shmkey = ftok(pathname, proj_id)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("ftok error!\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;if ((sid = shmget(shmkey, size, IPC_CREAT | 0666)) == -1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror ("shmget call failed.\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return (sid);

}



int shm_delete (char * viraddr, int shmid)

{

&nbsp;&nbsp;&nbsp;&nbsp;shmdt(viraddr);

&nbsp;&nbsp;&nbsp;&nbsp;return shmctl(shmid,IPC_RMID,0);

}



int shm_show(char * viraddr)

{

&nbsp;&nbsp;&nbsp;&nbsp;int i;

&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i < B_SIZE; i++)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("-%d---", *(viraddr + i));

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");

}























论坛徽章:
0
4 [报告]
发表于 2008-12-09 19:17 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP