用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