Linux文件FD:深入探讨文件句柄及其作用
Linux文件FD(文件描述符)是Linux系统中操作文件时最重要的一环,熟练掌握文件描述符及其在Linux操作系统中的通用作用,对理解Linux系统以及提高计算机系统编程效率非常重要。
文件描述符即句柄,它是内核中标识一个文件的一个非负整数,内核使用这个整数来查找对应的文件信息。句柄就像我们使用书籍的ISBN编号一样,是文件的唯一标识符,可以用句柄来标记任一文件。任一普通文件都会分配一个唯一的文件描述符,描述符可以用来访问和操作文件。
在Linux操作系统中文件句柄有诸多作用。第一,利用文件句柄可以实现对文件的读写访问。在Linux系统中,文件句柄和文件形成一种关联,该句柄控制对文件的操作,包括读写,通过系统调用read和write可去操作该句柄的文件:
// 打开文件int fd = open("myfile.txt",O_RDWR);// 读文件int ret = read(fd, buffer, sizeof(buffer));// 写文件int ret = write(fd, buffer, sizeof(buffer));// 关闭文件close(fd);
第二,文件描述符也是常见的文件定位方式,比方说可以实现文件的定位读取,可以通过lseek系统调用定位文件句柄的偏移量,利用这种策略可以实现很多读取文件的技术,比方说断点续传或者“seek”影片等等:
// 定位文件偏移量off_t newPosition = lseek(fd, offset, SEEK_SET);
文件描述符可以看做是控制文件访问的一个接口,提供诸多方便的操作文件的接口,可以帮助开发者更快更好的操作文件,以提高编程效率。
总之,文件句柄是Linux操作系统中一部分很重要的部分。理解Linux文件句柄及其作用,有助于我们更好的去理解和操作Linux操作系统,从而提高编程效率。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
关于linux编程中Fork和pipe的问题

fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括: —全局和局部变量 —打开的文件句柄 —共享内存、消息等同步对象由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么: —父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了 —反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,SOCket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。 在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。
linux 编程问题 在主进程中创建2个子进程,一个用exec函数,一个用fork
编写一段程序,使用系统调用fork( )创建两个子进程。 当此程序运行时,在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。 试观察记录屏幕上的显示结果,并分析原因。 〈程序〉 #include main() { int p1,p2; if(p1=fork()) /*子进程创建成功*/ putchar(b); else { if(p2=fork()) /*子进程创建成功*/ putchar(c); else putchar(a); /*父进程执行*/ } } bca(有时会出现abc的任意的排列) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 编制一段程序,实现进程的管道通信。 使用系统调用pipe()建立一条管道线。 两个子进程p1和p2分别向通道个写一句话: child1 Process is sending message! child2 process is sending message! 而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。 〈程序〉 #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); /*同步*/ read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf(%s\n,inpipe); wait(0); read(fd[0],inpipe,50); printf(%s\n,inpipe); exit(0); } } } 〈运行结果〉延迟5秒后显示: child1 process is sending message! 再延迟5秒: child2 process is sending message! 附:我承认我是复制的 不过很符合题意~
删除文件时提示正在被另一程序使用怎么办
1. 鼠标右键点击电脑最低端的任务栏,然后在弹出的对话框里选择启动任务管理器2. 然后我们转到性能选项卡下,然后在该页面右下角可以看到资源监视器,3. 继续点击资源监视器,然后在CPU状态下我们可以看到目前正在运行的程序以及CPU使用情况,中间位置有一个关联的句柄搜索框4. 然后在该搜索框里输入刚才要删除文件的文件名,在下面就会弹出该文件的列表,我们点击鼠标左键选择该文件,然后点击右键结束进程”,然后重新删除就搞定了问题处理完成后,您也可以尝试使用腾讯电脑管家,全方位实时保护你的电脑
发表评论