Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828939
  • 博文数量: 330
  • 博客积分: 9641
  • 博客等级: 中将
  • 技术积分: 3181
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
文章分类

全部博文(330)

文章存档

2012年(17)

2011年(135)

2010年(85)

2009年(57)

2008年(36)

我的朋友

分类: C/C++

2010-05-19 18:54:50

  strcpy是以'\0'判断结尾的,而memcpy不存在'\0'结尾的问题,它拷贝的是内存地址。(strcmp和memcmp同理)

  今天遇到的问题是memcpy,strncpy,snprintf指定拷贝的长度问题。比如字符串"abc",我指定的长度如果是3就会有结尾的问题产生,但是我指定4就一定会在"abc"的末尾跟上'\0'然后放入目的地址中吗?不一定
  通常是自动在结尾加上'\0',在mmap写读文件的时候就不会。通常的办法是:

memcpy(buf,srcbuf,sizeof(buf));
buf[strlen(srcbuf)]=0;


Mmap时会出错情况程序示例。
mapShareWr.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef struct {
    char name[4];
    int age;
} people;

int main(int argc, char **argv)
{
    int fd, i;
    people *p_map;
    char temp;

    fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0777);
    lseek(fd, sizeof(people) * 5 - 1, SEEK_SET);
    write(fd, "", 1);


    p_map = (people*)mmap(NULL, sizeof(people)*10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    close(fd);

    temp = 'a';
    for (i = 0; i < 10; i++) {
        temp += 1;
        memcpy( ( *(p_map+i) ).name, &temp, 4);
        (*(p_map+i) ).name[1] = '\0';
        (*(p_map+i) ).age = 20+i;
    }

    printf("Initialize over \n");
    sleep(5);

    munmap(p_map, sizeof(people) * 10);
    printf("unmap OK \n");

    return 0;
}


mapShareRe.c

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef struct {
    char name[4];
    int age;
} people;

int main(int argc, char **argv)
{
    int fd, i;
    people *p_map;

    fd = open(argv[1], O_CREAT | O_RDWR, 0777);

    p_map = (people*)mmap(NULL, sizeof(people)*10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    for (i = 0; i < 10; i++) {
        printf( "name: %s age: %d\n", (*(p_map+i) ).name, (*(p_map+i) ).age );


    }

    munmap(p_map, sizeof(people) * 10);

    close(fd);
    return 0;
}


gcc mapShareRe.c -o re
gcc mapShareWr.c -o wr
./wr share
./re share
wr程序执行中读,和执行后读的结果是不同的,可是如果没有
(*(p_map+i) ).name[1] = '\0';
就会出问题。


参考链接:
我没有在Linux/FreeBSD下面找到strlcpy
阅读(875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~