c程序设计脚本锦集

文件的底层访问

一个运行中的程序被称为一个进程,它有一些与之关系的文件描述符.这是一些小数值整数,用户可以通过它们访问打开的文件和设备.可用文件描述符的数量取决于unix系统折配置情况.在一个程序开始运行的时候,这些文件描述符里一般会有三个是已经为它打开了的.这们是:

0  标准输入
1  标准输出
2  标准错误

用户可以通过系统调用open把其它文件描述符与文件和设备关联在一起,我们马上就要介绍到这个调用.即使只有自动打开的文件描述符,就已经足以让我们利用write编写出一些简单的程序了.

1.write函数

#include <unistd.h>
size_t write(int fildes, const void *buf, size_t nbytes)

系统调用write的作用昌把缓冲区buf里的前nbytes个字节写入与文件描述符fildes相关联的文件中去.它的返回值是实际写出的字节数.如果文件描述符有错,或者询问设备驱动程序对数据块尺寸比较敏感,该返回值就可能会小于nbytes的值.如果这个函数的返回值是0,就表示没有写出任何数据;如果是-1,就表示在write调用中出现了错误,对应的错误代码保存在全局变量error里面.

文件:simple_write.c

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
char *pstr = "abcdefg";
size_t len=strlen(pstr);

printf("%d\n",len);

        if ((write(1, "abcdefg", len)) != len)
                write(1,"error",5);
        else
                printf("\nok\n");
        exit(0);
}

运行:


#gcc -o abc simple_write.c
[root@bogon works]# ./abc
7
abcdefg
ok

这里我们将整个字符串都输出了,如果指定的长度小于实际字符串的长度的话,则只有输出部分字符串了.

C语言参考手册:http://docs.haohtml.com/c/index.html

=============================

 2.read系统调用函数

 #include <unistd.h>
size_t read(int fildes, const void *buf, size_t nbytes);

系统调用read的作用是从与文件描述符fildes相关联的文件里读入nbytes个字节的数据并把它们放到数据区buf里去.它的返回值是实际诗篇的字节数,它可能会小于nbytes的值.如果这个的返回值是0,就表示没有读入任何数据;它到达了文件尾.同样,如果是-1,就表示在read调用中出现了错误.

文件: read.c

#include <unistd.h>

#include <stdlib.h>

int main()
{
        char buffer[128];
        size_t nread;

        nread = read(0, buffer, 128);

        if (nread == -1)
                write(2, "a read error has occurred\n", 26);
        if ((write(1, buffer, nread)) != nread)
                write(2, "a write error has occurred\n", 27);

        exit(0);

}

运行:

#gcc -o read read.c
#echo a b c | ./read
abc
#./read < test.txt
this a char in the fie test.txt
aOK1234878 test
#

这里test.txt文件里只有两个文字,总长度小于128.如果大于128的话,则执行完命令后的#提示符会在最后一行的末尾.

=================================

ioctl系统调用:

文件:copy_system.c

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
        char c;
        int in,out;

        in = open("file.in", O_RDONLY);
        out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
        while(read(in, &c, 128) == 128)
                write(out, &c, 128);
        exit(0);
}

查看程序执行花费时间(file.in文件大小为1M):
#gcc -o copy copy_system.c
#time ./copy
上面每次只读取和写入一个字节,如果修改成128个字节的话,速度会提高很多.
我们这里改进为一次读取1024个字节

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
        char c;
        char block[1024];
        int in,out;
        int nread;

        in = open("file.in", O_RDONLY);
        out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);

        while((nread = read(in, block, sizeof(block))) > 0)
                write(out, block, nread);
        exit(0);
}

发现改进后的时间更短了.因为它只需做大约2000次的系统调用就足够了.当时此时与系统本身的性能也有很大的关系.但这里足以看出来调用调用的开支还是特别的大的.
=================================================
unlink函数

#include <unistd.h>
int unlink(const char *path);
int link(const char *path1, const char *path2);
int symlink(const char *path1, const char *path2)

文件:ulink

#include <unistd.h>
#include <stdlib.h>

int main()
{
        int ret;
        char *ppath = "./file.out";
        ret = unlink(ppath);
        if (ret == -1)
                write(1, "error", 5);
        exit(0);
}

====================================

Leave a Reply