c语言可重入函数read 可重入函数fork

C语言read函数read内部是调_read, _readc语言可重入函数read的返回值在msdn中有这样c语言可重入函数read的描述
_read returns the number of bytes read, which might be less than count if there are fewer than count bytes left in the file or if the file was opened in text mode, in which case each carriage return–line feed (CR-LF) pair is replaced with a single linefeed character. Only the single linefeed character is counted in the return value. The replacement does not affect the file pointer.
注意这一段: in which case each carriage return–line feed (CR-LF) pair is replaced with a single linefeed character
就是说如果用text模式打开c语言可重入函数read的话, 文件换行时可能在文本中有2个字符----换行和缩进(CR-LF), 而在returnc语言可重入函数read的时候系统是把它作为1个回车符号('\n')所返回c语言可重入函数read的. 所以会导致这个情况
C中read()的用法?read()函数的原型是int read(int fd,void *buf,int count); 。它的功能是“从文件说明符fd相关联的文件中读取count个字符,并把这些字符存储到buf所指的缓冲区中 。返回值是操作成功时所读到的字节数,在文件结束时可能少于count个字节;若返回值为-1则说明出错了 , 返回0则表示到达文件尾端 。例:从文件ABC.txt中读取前100个字节存入数组buffer中——
#include "stdin.h"
#include "io.h"
#include "fcnt1.h"
int main(void){
int fd;
char buffer[100];
if((fd=open("ABC.txt",O_RDONLY))==-1){
printf("Can't open file.\n");
exit(-1);
}
if(read(fd,buffer,100)!=100)
printf("Possible read error!\n");
}
单片机C语言设计里说的可重入函数是什么?和不可重入函数的区别是什么?一、可重入函数
1)什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误 。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断) 。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据 。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据 。
2)可重入函数:
不为连续的调用持有静态数据 。
不返回指向静态数据的指针;所有数据都由函数的调用者提供 。
【c语言可重入函数read 可重入函数fork】使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据 。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量 。
绝不调用任何不可重入函数 。
3)不可重入函数:
函数中使用了静态变量,无论是全局静态变量还是局部静态变量 。
函数返回静态变量 。
函数中调用了不可重入函数 。
函数体内使用了静态的数据结构;
函数体内调用了malloc()或者free()函数;
函数体内调用了其他标准I/O函数 。
函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量。
总的来说 , 如果一个函数在重入条件下使用了未受保护的共享的资源 , 那么它是不可重入的 。
什么是C语言的可重入函数?怎么使用?从字面上的意思就是,可以重复进入 。可重入是在多任务系统下的概念,意思是这个函数可以在运行到任意位置的时候被中断去执行其他任务,并且返回的时候不会出现任何错误 。为什么在多任务的时候才有这种概念 。我举个例子,我们定义了一个叫func的函数 , 同时定义了两个线程,两个线程都调用了func , 那么就存在这种情况,线程1正在执行func的时候 , 线程2开始执行func了,导致两个时刻两个线程都在执行func,正常情况下两个都能执行成功,并且没有错误 , 我们就认为func是可重入的 。但是如果func使用了公共资源,比如读取同一个文件,或者访问了同一个全局变量,这时候就会导致两个线程访问公共资源时发生冲突 , 这样的函数就是不可重入的 。

推荐阅读