用C语言显示缓冲区

用C语言显示缓冲区,c,C,我正试图显示一个缓冲区,但它是用特殊字符显示的。这是我的密码: size_t write(int fd, const void *buf, size_t count) { static size_t (*write_func)(int, const void *, size_t) = NULL; if (!write_func) write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT

我正试图显示一个缓冲区,但它是用特殊字符显示的。这是我的密码:

size_t write(int fd, const void *buf, size_t count)
{

    static size_t (*write_func)(int, const void *, size_t) = NULL;
    if (!write_func)
        write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write");


    char tmp[count];  

    memcpy(tmp,buf,count);
    printf("  %c \n",tmp[1]);

你对如何解决这个问题有什么想法吗?非常感谢你

在堆栈上分配只读数据的副本。这是危险的,因为堆栈空间可能有限。(在Linux中,只有原始堆栈会动态增长;线程堆栈的大小是固定的,并且通常非常小。)

然后使用stdio.h
printf()
函数将指定数据的第二个字节(即使
count
可能是1)输出到标准输出,因此您可能仍然要访问临时数组之外的数据

大多数
printf()
实现在内部调用
write()
来刷新缓冲区。根据链接的不同,这可能最终是递归的(调用
printf
的函数调用调用
printf
的函数等等),耗尽进程可用的所有RAM,然后崩溃

以上这些都没有意义

首先,如果需要复制输入数据,请使用
malloc()
memcpy()
动态复制,然后使用
free()
复制。这样,您就不会突然在多线程程序中导致崩溃(在Linux中,除了原始进程之外,堆栈空间是有限的,并且是固定的)

其次,您需要使用使用链接器获得的原始
write_func

第三,您需要保留
errno
,以避免客户端程序中出现不可预见的问题。只需使用一个临时本地
int
来存储它。请记住,不仅
write()
,而且
malloc()
free()
可能会修改
errno
,您必须对调用者隐藏这些更改

第四,
write()
的返回类型是
ssize\u t
,而不是
size\u t
。前者是有签名的,后者可以是无签名的

第五,总是允许短写。你不能指望得到一个“完整”的块;应用程序进行内部处理,特别是在使用套接字时,以奇数大小刷新它(特别是TCP/IP和UDP/IP的MTU的倍数)。您对输入/输出的“修改”必须是无状态的。更糟的是,如果您的修改改变了缓冲区长度,描述符是非阻塞的,并且<代码> WraveScript函数()/代码>调用返回一个短写,只在修改部分的中间,它不敏感地映射到任何原始字节,您将如何处理它?实际上,您不能重试,因为描述符是非阻塞的;原始应用程序可能会挂起(例如,如果以协进程方式使用,同时从具有严格排序要求的对等进程发送和接收数据),因为您的添加将在应用程序逻辑级别不允许写入时重新发出写入

简言之,你的计划行不通。您可能会让它与一些特定的简单应用程序一起工作,但它会严重破坏其他应用程序。无论你想实现什么,都有更好的方法


我希望我没有说得太直截了当,但我郑重地建议您首先了解低级POSIX I/O的细节,然后再围绕它们创建包装器。这是我可以推荐的一个很好的参考资料,但我认为您可能需要先从一些教程开始。

这与
write\u func
有什么关系?
buf
count
是如何填充的?如果count是
1
tmp[1]
是不受限制的,因为数组从
0运行到N-1
我使用linux插入机制重定向写函数并修改缓冲区真的非常感谢您的所有解释,我的测试应用程序是一个客户端,它向服务器发送一个字符,服务器递增并发送下一个字符。我的目标是将另外两个字符附加到发送的消息中,在接收时,我将这两个字符存储在一个文件中,我已经考虑了您的所有评论,下面是代码:ssize_t write(int fd,const void buf,size_t count){static size_t(*write_func)(int,const void*,size_t)=NULL;if(write_func==NULL){write_func=dlsym(RTLD_NEXT),“write”);if(!write_func){printf(“错误:无法加载'write':”);put(dlerror());exit(-1);}if(!write_func)write_func=(size_t()(int,const void*,size_t))dlsym(RTLD_NEXT,“write”);char*tmp;tmp=malloc(sizeof(char));memcpy(tmp,buf,count);char buffer[100]={'1','2';int i;int j=0;for(i=strlen);strlen