免费注册 查看新帖 |

Chinaunix

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

[C] 进程间通信的例子,调不出来了,请大家帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-14 16:45 |只看该作者 |倒序浏览
功能:
code7-3-b.c 从键盘读入数据,存放在共享内存中。

code7-3-a.c则隔10秒检测一次共享内存, 并从共享内存中读取数据,显示到屏幕上。


代码如下:
//code7-3-a.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 1024
#define MYKEY 24

int main(void)
{
        int shmid;
        char *shmptr;
        if(shmid = shmget(MYKEY, BUF_SIZE, IPC_CREAT) == -1) {
                printf("shmget error\n");
                exit(1);
        }

        if ((shmptr = shmat(shmid, 0, 0)) == (void *)-1) {
                fprintf(stderr, "shmat error\n");
                exit(1);
        }
        while(1) {
                printf("string: %s\n", shmptr);
                sleep(10);
        }
        shmdt(shmptr);
        exit(0);
}
//code7-3-b.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 1024
#define MYKEY 24

int main(void)
{
        int shmid;
        char *shmptr;
        if (shmid = shmget(MYKEY, BUF_SIZE, IPC_CREAT) == -1) {
                printf("shmget error\n");
                exit(1);
        }

        if ((shmptr = shmat(shmid, 0, 0)) == (void *)-1) {
                fprintf(stderr, "shmat error\n");
                exit(1);
        }

        while(1) {
                scanf("input string: %s\n", shmptr);
        }
        shmdt(shmptr);
        exit(0);
}

论坛徽章:
0
2 [报告]
发表于 2010-10-14 18:46 |只看该作者
  1.                 scanf("input string: %s\n", shmptr);
复制代码
......

论坛徽章:
0
3 [报告]
发表于 2010-10-14 19:12 |只看该作者
回复 2# liwangli1983


    什么情况!

论坛徽章:
0
4 [报告]
发表于 2010-10-14 19:37 |只看该作者
回复  liwangli1983


    什么情况!
aaron_xueli 发表于 2010-10-14 19:12


第一,把scanf当printf用了,格式化字符串完全错误。

第二,此处不应该用scanf获取,因为有越界的危险,建议改用fgets

论坛徽章:
0
5 [报告]
发表于 2010-10-15 10:08 |只看该作者
编译时,发现错误提示:shmat error

论坛徽章:
0
6 [报告]
发表于 2010-10-15 10:17 |只看该作者
请各位牛人帮忙啦!!!

论坛徽章:
0
7 [报告]
发表于 2010-10-15 10:28 |只看该作者
加perror看看具体的错误是什么

论坛徽章:
0
8 [报告]
发表于 2010-10-15 10:47 |只看该作者
回复 1# aaron_xueli


    进程间通信的话,shmkey应该是ftok出来的吧,
    然后一个创建(code7-3-a.c)
    if(shmid = shmget(MYKEY, BUF_SIZE, IPC_CREAT) == -1) {
    另一个应该是复用,而不是创建(code7-3-b.c)
    if (shmid = shmget(MYKEY, BUF_SIZE, IPC_CREAT) == -1) { ※IPC_CREAT应该改成IPC_ALLOC吧
   
    可以试一下

论坛徽章:
0
9 [报告]
发表于 2010-10-15 11:05 |只看该作者
回复 8# justem0


    多谢!

论坛徽章:
0
10 [报告]
发表于 2010-10-15 11:17 |只看该作者
发现了新问题!!!

提示:shmat: Identifier removed

修改后代码:

//code7-3-a.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 1024
#define MYKEY 24

int main(void)
{
        int shmid;
        char *shmptr;
        key_t key;
        key = ftok("/dev/null", 0);
        if (key == -1) {
                perror("ftok");
                exit(1);
        }

        if(shmid = shmget(key, BUF_SIZE, IPC_CREAT | 0666) == -1) {
                perror("shmget");
                exit(1);
        }

        if ((shmptr = (char *)shmat(shmid, NULL, 0)) == ((void *)(-1))) {
                perror("shmat");
                exit(1);
        }
        while(1) {
                printf("string: %s\n", shmptr);
                sleep(10);
        }

        if(shmctl(shmid, IPC_RMID, NULL) == -1) {
                perror("shmctl");
                exit(1);
        }
        exit(0);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP