3.12 dup函数-文件描述符复制

来源:互联网 发布:算法复杂度分析 教材 编辑:程序博客网 时间:2024/06/09 19:46

dup函数用于从一个已存在的文件描述符复制一个新文件描述符。函数原型如下:

#include <unistd.h>int dup(int filedes);
返回值:若赋值成功则返回新文件描述符,若出错则返回-1

参数:filedes被复制文件描述符。

实例 x.3.12.1.c

#include <fcntl.h>#include <unistd.h>#include <stdio.h>#define BUFFSIZE 256int main(void){    char         filepath[] = "/tmp/myfile"; /*待操作文件路径*/    int          f_id1, f_id2;               /*文件描述符*/        ssize_t      nwrite;                     /*实际写入字节数*/    size_t       nbytes;                     /*要写入的字节数*/    off_t        offset;                     /*文件指针偏移量*/    char         buf[BUFFSIZE] = "0123456789"; /*待写入数据*//*打开文件,获取文件描述符*/    f_id1 = open(filepath, O_RDWR | O_CREAT);    if (f_id1 == -1) {        printf("open error for %s\n", filepath);        return 1;    }    f_id2 = dup(f_id1); /*复制文件描述符*/    if (f_id2 == -1) {        printf("dup error for f_id2\n");        return 2;    }    printf("f_id1:%d\n", f_id1);    printf("f_id2:%d\n", f_id2);/*把文件指针移动到文件开始处*/    offset = lseek(f_id1, 0, SEEK_SET);    if (offset == -1) {        printf("lseek error for %s\n", filepath);        return 3;    }/*通过文件描述符f_id1写入3字节数据[0-2]*/    nbytes = 3;    nwrite = write(f_id1, buf, nbytes);    if (nwrite == -1) {        printf("write error for f_id1(%d)\n", f_id1);        return 4;    }/*通过文件描述符f_id2写入7字节数据[3-9]*/    nbytes = 7;    nwrite = write(f_id2, (buf + 3), nbytes);    if (nwrite == -1) {        printf("write error for f_id2(%d)\n", f_id2);        return 5;    }    close(f_id1);    close(f_id2);}

编译与执行:

[root@localhost unixc]# rm -f /tmp/myfile
[root@localhost unixc]# cc x.3.12.1.c
[root@localhost unixc]# ./a.out
f_id1:3
f_id2:4
[root@localhost unixc]# cat /tmp/myfile
0123456789[root@localhost unixc]#

分析:

1、复制出来的新文件描述符f_id2一般为当前可用文件描述符的最小值;

2、新复制出来的文件描述符f_id2与被复制的文件描述符f_id1共享一个文件表项:代码中第二次写操作是通过文件描述符f_id2来执行,并且没有调用lseek重新定位,但第二次写入并不覆盖第一次写入。

原创粉丝点击