【汇总】C语言函数

 

http://see.xidian.edu.cn/cpp/u/hanshu/   C语言函数手册

 

http://blog.csdn.net/wallwind/article/category/906727   UNIX环境高级编程

 

 

================ open

头文件:#include <sys/types.h>    #include <sys/stat.h>    #include <fcntl.h>

定义函数:
    int open(const char * pathname, int flags);
    int open(const char * pathname, int flags, mode_t mode);

函数说明:

参数 pathname 指向欲打开的文件路径字符串. 下列是参数flags 所能使用的旗标:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合.
O_CREAT 若欲打开的文件不存在则自动建立该文件.
O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打开文件.
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。注:此为Linux2. 2 以后特有的旗标, 以避免一些系统安全问题.

参数mode 则有下列数种组合, 只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks).
S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.
S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.
S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.
S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.
S_IROTH 00004 权限, 代表其他用户具有可读的权限
S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.
S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.

返回值:若所有欲核查的权限都通过了检查则返回0 值, 表示成功, 只要有一个权限被禁止则返回-1.

错误代码:
EEXIST 参数pathname 所指的文件已存在, 却使用了O_CREAT 和O_EXCL 旗标.
EACCESS 参数pathname 所指的文件不符合所要求测试的权限.
EROFS 欲测试写入权限的文件存在于只读文件系统内.
EFAULT 参数pathname 指针超出可存取内存空间.
EINVAL 参数mode 不正确.
ENAMETOOLONG 参数 pathname 太长.
ENOTDIR 参数pathname 不是目录.
ENOMEM 核心内存不足.
ELOOP 参数pathname 有过多符号连接问题.
EIO I/O 存取错误.

附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再作open()空文件可能会造成系统安全上的问题.

范例
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
    int fd, size;
    char s[] = "Linux Programmer!\n", buffer[80];
    fd = open ("/tmp/temp", O_WRONLY|O_CREAT);
    write(fd, s, sizeof(s));
    close(fd);
    fd = open("/tmp/temp", O_RDONLY);
    size = read (fd, buffer, sizeof(buffer));
    close(fd);
    printf("%s", buffer);
}

执行
Linux Programmer!

 

=============== creat

头文件:#include <sys/types.h>   #include <sys/stat.h>   #include <fcntl.h>

定义函数:int creat(const char * pathname, mode_tmode);

函数说明:
1、参数 pathname 指向欲建立的文件路径字符串。
2、Creat()相当于使用下列的调用方式调用open()
    open(const char * pathname, (O_CREAT|O_WRONLY|O_TRUNC ));

错误代码:关于参数 mode 请参考open()函数.

返回值:
creat()会返回新的文件描述词, 若有错误发生则会返回-1, 并把错误代码设给errno.
EEXIST参数:pathname 所指的文件已存在.
EACCESS参数:pathname 所指定的文件不符合所要求测试的权限
EROFS:欲打开写入权限的文件存在于只读文件系统内
EFAULT参数:pathname 指针超出可存取的内存空间
EINVAL参数:mode 不正确.
ENAMETOOLONG参数:pathname 太长.
ENOTDIR 参数:pathname 为一目录
ENOMEM :核心内存不足
ELOOP 参数:pathname 有过多符号连接问题.
EMFILE:已达到进程可同时打开的文件数上限
ENFILE:已达到系统可同时打开的文件数上限

附加说明:creat()无法建立特别的装置文件, 如果需要请使用mknod().

 

 


================ lseek()—移动文件的读写位置

 

头文件:#include <sys/types.h>    #include <unistd.h>

定义函数:off_t lseek(int fildes, off_t offset, int whence);

函数说明:
每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数.

参数 whence 为下列其中一种:
    SEEK_SET 参数offset 即为新的读写位置.
    SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
    SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
    SEEK_END 时, 参数offet 允许负值的出现.

下列是教特别的使用方式:
1) 欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET);
2) 欲将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END);
3) 想要取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR);


返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节 . 若有错误则返回-1, errno 会存放错误代码.

附加说明:Linux 系统不允许lseek()对tty 装置作用, 此项动作会令lseek()返回ESPIPE.

 

================ read()读取指定的字节数 ,读文件函数(由已打开的文件读取数据)

不带缓冲是指每个read和write都调用内核中的一个系统调用

头文件:#include <unistd.h>

定义函数:ssize_t read(int fd, void * buf, size_t count);

函数说明:read()会把参数fd 所指的文件传送count 个字节到buf 指针所指的内存中. 若参数count 为0 , 则read()不会有作用并返回0. 返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动.

附加说明:
如果顺利 read()会返回实际读到的字节数 , 最好能将返回值与参数count 作比较, 若返回的字节数比要求读取的字节数少, 则有可能读到了文件尾、从管道(pipe)或终端机被信号中断了读取动作.

当有错误发生时则返回-1, 错误代码存入errno 中, 而文件读写位置则无法预期.

错误代码:
EINTR 此调用被信号所中断.
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK), 若无数据可读取则返回此值.
EBADF 参数fd 非有效的文件描述词, 或该文件已关闭.

 

 

 

 

 

================= write()—写文件函数

 

 

头文件:#include <unistd.h>

定义函数:ssize_t write (int fd, const void * buf, size_t count);

函数说明:write()会把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内 . 当然, 文件读写位置也会随之移动.

返回值:如果顺利write()会返回实际写入的字节数. 当有错误发生时则返回-1 , 错误代码存入errno 中.

错误代码:
EINTR 此调用被信号所中断.
EAGAIN 当使用不可阻断I/O 时 (O_NONBLOCK), 若无数据可读取则返回此值.
EADF 参数fd 非有效的文件描述词, 或该文件已关闭.

 

 

实例:将标准输入复制到标准输出

函数open,read,write,lseek,close提供了不用缓冲的IO,这些函数都使用文件描述符

 

#define BUFFSIZE 4096

 

int

main(void)

{

    char  buf[BUFFSIZE ]

    while ((n = read(STDIN_FILENO, buf, BUFFSIZE )) >0 ) #读取的字节书赋指给n

        if(write(STDOUT_FILEON,buf, n) != n )

            printf("write error");

 

    if (n <0)

        printf("read error");

 

    exit(0);

}

 

 

 

 

================ getc() —读文件函数(由文件中读取一个字符 )

头文件:#include <stdio.h>

定义函数:int getc(FILE * stream);

函数说明:getc()用来从参数stream 所指的文件中读取一个字符. 若读到文件尾而无数据时便返回EOF. 虽然getc()与fgetc()作用相同, 但getc()为宏定义, 非真正的函数调用.

返回值:getc()会返回读取到的字符, 若返回EOF 则表示到了文件尾.

 

 

 

================== putc() —写文件函数(将一个指定字符写入文件中 )

 

 

 

头文件:#include <stdio.h>

定义函数:int putc(int c, FILE * stream);

函数说明:putc()会将参数c 转为unsigned char 后写入参数stream 指定的文件中. 虽然putc()与fputc()作用相同, 但putc()为宏定义, 非真正的函数调用.

返回值:putc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败.

 

 

实例:用标准IO将标准输入复制到标准输出

标准IO函数提供一种对用缓冲IO函数的带缓冲的接口

 

 

 

int

main(void)

{

    int c;

    while (( c = getc(stdin) != EOF)

        if(putc(c, stdout) == EOF)

            printf("output error");

 

    if(ferror(stdin))

        printf(input error);

    exit(0);

}

 

 

================= getpid() —获取进程识别码

 

 

 

头文件:#include <unistd.h>

定义函数:pid_t getpid(void);

函数说明:getpid ()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件, 以避免临时文件相同带来的问题。

返回值:目前进程的进程识别码

范例
#include <unistd.h>
main()
{
    printf("pid=%d\n", getpid());
}

执行:
pid=1494 /*每次执行结果都不一定相同 */

 

 

http://zhengdl126.iteye.com/admin/blogs/1739405/edit

 

=============== fgets()—读取文件字符串

 

头文件:include<stdio.h>

定义函数:har * fgets(char * s, int size, FILE * stream);

函数说明:fgets()用来从参数stream 所指的文件内读入字符并存到参数s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止, 最后会加上NULL 作为字符串结束 .

返回值:gets()若成功则返回s 指针, 返回NULL 则表示有错误发生.

范例
#include <stdio.h>
main()
{
    char s[80];
    fputs(fgets(s, 80, stdin), stdout);
}

执行
this is a test //输入
this is a test //输出

 

 

================== fork

 

 

int main ()

  {

  pid_t pid;

  int count = 0;

  pid = fork ();

  if (pid != 0) {

  printf ("我是孩儿他爹\n\n");

  count += 1;

  }

  else {

  printf ("我是我爹的儿子\n\n");

  count += 1;

  }

  printf("统计结果是:%d\n", count);

  return 0;

  }

  编译-- gcc fork.c -o fork

  运行,结果如下:

  我是我爹的儿子

  统计结果是:1

  我是孩儿他爹

  统计结果是:1

  从中我们可以看出,在执行了fork函数后,子进程首先执行,然后是父进程,同时通过计数器可以看出,

  两个进程不共享内存区域(不共享count这个变量),形成了两个相对独立的进程

 

=================== execlp()—从PATH 环境变量中查找文件并执行

 

 

头文件:#include <unistd.h>

定义函数:int execlp(const char * file, const char * arg, ...);

函数说明:execlp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名, 找到后便执行该文件, 然后将第二个以后的参数当做该文件的argv[0], argv[1], ..., 最后一个参数必须用空指针(NULL)作结束.

返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

错误代码:参考 execve().

范例
/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin 找到/bin/ls */
#include <unistd.h>
main()
{
    execlp("ls", "ls", "-al", "/etc/passwd", (char *)0 );
}

执行:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

 

 

===================== waitpid ()—中断(结束)进程函数(等待子进程中断或结束)

 

头文件:#include <sys/types.h>    #include <sys/wait.h>

定义函数:pid_t waitpid(pid_t pid, int * status, int options);

函数说明:waitpid()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回 , 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数status 可以设成NULL. 参数pid 为欲等待的子进程识别码, 其他数值意义如下:

1、pid<-1 等待进程组识别码为pid 绝对值的任何子进程.
2、pid=-1 等待任何子进程, 相当于wait().
3、pid=0 等待进程组识别码与目前进程相同的任何子进程.
4、pid>0 等待任何子进程识别码为pid 的子进程.

参数option 可以为0 或下面的OR 组合

WNOHANG:如果没有任何已经结束的子进程则马上返回, 不予以等待.
WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会. 子进程的结束状态返回后存于status, 底下有几个宏可判别结束情况
WIFEXITED(status):如果子进程正常结束则为非0 值.
WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏.
WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status):取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏.
WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况.
WSTOPSIG(status):取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏.

返回值:如果执行成功则返回子进程识别码(PID), 如果有错误发生则返回-1. 失败原因存于errno 中.

 

 


实例:从标准输入读命令,然后执行这些命令。类shell程序的简化实现

 

#include <sys/wait.h>
#define MAXLINE 1024
int
main(void)
{
    char buf[MAXLINE];
    pid_t pid;
    int status;

   
    printf("%% ");
    while (fgets(buf, MAXLINE, stdin) != null) {
        if (buf[strlen(buf)] -1 == '\n')//用null替换换行符,要求以null结尾
            buf[strlen(buf) -1 ] = 0;
       
        if ((pid = fork()) <0 ){ //fork 创建一个新进程
            printf(fork error");
        } else if(pid ==0 ){
            execlp(buf, buf ,(char *)0);
            err_ret("could not execute :%s",buf);
            exit(127);
        }
   
        /* parent*/
        if((pid = waitpid(pid, &status, 0) ) <0 )
            printf("waitpid error);
        printf("%% ");
       
    }
    exit(0);
}


输出:
$./a.out
% pwd
/tmp
% ls
Makefile
% ^D
$

 

============== signal()—设置信号处理方式

 

头文件:#include <signal.h>

定义函数:void (*signal(int signum, void(* handler)(int)))(int);

函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数handler 指定的函数执行. 如果参数handler 不是函数指针, 则必须是下列两个常数之一:
1、SIG_IGN 忽略参数signum 指定的信号.
2、SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式.

关于信号的编号和说明, 请参考附录D

返回值:返回先前的信号处理函数指针 , 如果有错误则返回SIG_ERR(-1).

附加说明:在信号发生跳转到自定的 handler 处理函数执行后, 系统会自动将此处理函数换回原来系统预设的处理方式, 如果要改变此操作请改用sigaction().

 

 

=============== access 检查是否可以读/写某一已存在的文件

 

 

头文件:#include <unistd.h>

定义函数:int access(const char * pathname, int mode);

函数说明:access()会检查是否可以读/写某一已存在的文件。

参数mode 有几种情况组合:
1、R_OK, W_OK, X_OK和F_OK. R_OK, W_OK 与X_OK 用来检查文件是否具有读娶写入和执行的权限。
2、F_OK 则是用来判断该文件是否存在。由于access()只作权限的核查, 并不理会文件形态或文件内容,因此,如果一目录表示为"可写入",表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如:你会发现DOS 的文件都具有"可执行"权限,但用execve()执行时则会失败。

返回值:若所有欲查核的权限都通过了检查则返回0 值,表示成功,只要有一权限被禁止则返回-1。

错误代码:
1、EACCESS 参数pathname 所指定的文件不符合所要求测试的权限.
2、EROFS 欲测试写入权限的文件存在于只读文件系统内.
3、EFAULT 参数pathname 指针超出可存取内存空间.
4、EINVAL 参数mode 不正确.
5、ENAMETOOLONG 参数pathname 太长.
6、ENOTDIR 参数pathname 为一目录.
7、ENOMEM 核心内存不足
8、ELOOP 参数pathname 有过多符号连接问题.
9、EIO I/O 存取错误.

附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再做open()的空文件可能会造成系统安全上的问题.

范例:
/* 判断是否允许读取/etc/passwd */
#include <unistd.h>
int main()
{
    if(access ("/etc/passwd", R_OK) == 0)
    printf("/etc/passwd can be read\n");
}

执行:
/etc/passwd can be read

 

 

说明:下面的例子用来测试指定的文件是否具有可读权限
 
          #include<unistd.h>
          #include<stdio.h>
          #include<stdlib.h>
 
          int main(int argc,char *argv[]){
                   if(argc<2){
                         printf("Usage:%s filename\n",argv[0]);
                         exit(1);}
                   if(access (argv[1],R_OK)==0){
                         printf("File:%s can read\n",argv[1]);}
                   else
                         printf("File:%s can't read\n",argv[1]);
                   return 0;
            }

 

============= umask设置建立新文件时的权限遮罩

 

头文件:#include <sys/types.h>   #include <sys/stat.h>

定义函数:mode_t umask(mode_t mask);

函数说明:umask()会将系统umask值设成参数mask&0777后的值, 然后将先前的umask值返回。在使用open()建立新文件时, 该参数mode 并非真正建立文件的权限, 而是(mode&~umask)的权限值。

 

 

在建立文件时指定文件权限为0666, 通常umask 值默认为022, 则该文件的真正权限则为0666&~022=0644, 也就是rw-r--r--返回值此调用不会有错误值返回. 返回值为原先系统的umask 值。

 

 

============= chmod 修改文件权限

 

 

chmod 函数在制定的文件进行操作,而fchmod函数则对已经打开的文件进行操作

如果一目录具有S_ISUID 位权限,表示在此目录下只有该文件的所有者或root 可以删除该文件。如tmp目录



头文件:#include <sys/types.h>   #include <sys/stat.h>

定义函数:int chmod(const char * path, mode_t mode);

函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限。

参数 mode 有下列数种组合:
1、S_ISUID 04000 文件的 (set user-id on execution)位
2、S_ISGID 02000 文件的 (set group-id on execution)位
3、S_ISVTX 01000 文件的sticky 位
4、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限
5、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限
6、S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限
7、S_IRGRP 00040 用户组具可读取权限
8、S_IWGRP 00020 用户组具可写入权限
9、S_IXGRP 00010 用户组具可执行权限
10、S_IROTH 00004 其他用户具可读取权限
11、S_IWOTH 00002 其他用户具可写入权限
12、S_IXOTH 00001 其他用户具可执行权限

注:只有该文件的所有者或有效用户识别码为0,才可以修改该文件权限。

基于系统安全,如果欲将数据写入一执行文件,而该执行文件具有S_ISUID 或S_ISGID 权限,则这两个位会被清除。如果一目录具有S_ISUID 位权限,表示在此目录下只有该文件的所有者或root 可以删除该文件。

返回值:权限改变成功返回0, 失败返回-1, 错误原因存于errno.

错误代码:
1、EPERM 进程的有效用户识别码与欲修改权限的文件拥有者不同, 而且也不具root 权限.
2、EACCESS 参数path 所指定的文件无法存取.
3、EROFS 欲写入权限的文件存在于只读文件系统内.
4、EFAULT 参数path 指针超出可存取内存空间.
5、EINVAL 参数mode 不正确
6、ENAMETOOLONG 参数path 太长
7、ENOENT 指定的文件不存在
8、ENOTDIR 参数path 路径并非一目录
9、ENOMEM 核心内存不足
10、ELOOP 参数path 有过多符号连接问题.
11、EIO I/O 存取错误

范例
/* 将/etc/passwd 文件权限设成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
#include <sys/types.h>
#include <sys/stat.h>
main()
{
    chmod ("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}

#include "apue.h" 
 
int main(void) 

        struct stat  statbuf; 
        if(stat("foo",&statbuf)<0) 
          err_sys("stat error for foo"); 
        if(chmod("foo",(statbuf.st_mode&~S_IXGRP)|S_ISGID )<0) 
          err_sys("chmod err for foo"); 
 
        if(chmod ("bar",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH )<0) 
         err_sys("chmod err for bar"); 
 
        exit(0); 
 
 
}

 


【汇总】C语言函数

 

 

 

=============== 粘住位

 

如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一的情况下,才能删除或更名该目录下的文件:1.拥有该文件    2. 拥有该目录    3. 是超级用户

 

示例:目录/tmp和/var/spool/uucppublic是设置粘住位的典型候选者 ——任何用户都可在这两个目录中创建文件。任一用户(用户、组 和其他)对这两个目录的权限通常都是读、写和执行。但用户不应删除或更名属于其他人的文件,为此在这两个目录的文件模式中都设置了粘住位。

 

 

 

 

============== chown 改变文件所有者

 

lchown是改变符号链接本身的所有者,而不是该符号链接所指向的文件。

 

 

头文件:#include <sys/types.h>   #include <unistd.h>

定义函数:int chown(const char * path, uid_t owner, gid_t group);

 

函数说明:chown()会将参数path 指定文件的所有者变更为参数owner 代表的用户,而将该文件的组变更为参数group 组。如果参数owner 或group 为-1,对应的所有者或组不会有所改变。root 与文件所有者皆可改变文件组,但所有者必须是参数group 组的成员。当root 用chown()改变文件所有者或组时,该文件若具有S_ISUID或S_ISGID 权限,则会清除此权限位,此外如果具有S_ISGID 权限但不具S_IXGRP 位,则该文件会被强制锁定,文件模式会保留。


返回值:成功则返回0, 失败返回-1, 错误原因存于errno.
范例
/* 将/etc/passwd 的所有者和组都设为root */
#include <sys/types.h>
#include <unistd.h>
main()
{
    chown("/etc/passwd", 0, 0);
}

 

 

-------------- link()—建立文件连接


头文件:#include <unistd.h>

定义函数:int link (const char * oldpath, const char * newpath);

函数说明:link()以参数newpath 指定的名称来建立一个新的连接(硬连接)到参数oldpath 所指定的已存在文件. 如果参数newpath 指定的名称为一已存在的文件则不会建立连接.

返回值:成功则返回0, 失败返回-1, 错误原因存于errno.

附加说明:link()所建立的硬连接无法跨越不同文件系统, 如果需要请改用symlink().


范例:
/* 建立/etc/passwd 的硬连接为pass */
#include <unistd.h>
main()
{
    link("/etc/passwd", "pass");
}


-------------- unlink()—删除文件

头文件:#include <unistd.h>

定义函数:int unlink(const char * pathname);

函数说明:unlink()会删除参数pathname 指定的文件. 如果该文件名为最后连接点, 但有其他进程打开了此文件, 则在所有关于此文件的文件描述词皆关闭后才会删除. 如果参数pathname 为一符号连接, 则此连接会被删除。

返回值:成功则返回0, 失败返回-1, 错误原因存于errno



--------------  remove()—删除文件函数


头文件:#include <stdio.h>

定义函数:int remove(const char * pathname);

函数说明:remove()会删除参数pathname 指定的文件. 如果参数pathname 为一文件, 则调用unlink()处理,若参数pathname 为一目录, 则调用rmdir()来处理. 请参考unlink()与rmdir().

返回值:成功则返回0, 失败则返回-1, 错误原因存于errno.


-------------- rename()—更改文件名称或位置

头文件:#include <stdio.h>

定义函数:int rename(const char * oldpath, const char * newpath);

函数说明:rename()会将参数oldpath 所指定的文件名称改为参数newpath 所指的文件名称. 若newpath 所指定的文件已存在, 则会被删除.

返回值:执行成功则返回0, 失败返回-1, 错误原因存于errno

范例
/* 设计一个DOS 下的rename 指令rename 旧文件名新文件名 */
#include <stdio.h>
void main(int argc, char **argv)
{
    if(argc < 3)
    {
        printf("Usage: %s old_name new_name\n", argv[0]);
        return;
    }
    printf("%s=>%s", argc[1], argv[2]);
    if(rename(argv[1], argv[2]) < 0)
    printf("error!\n");
    else
    printf("ok!\n");
}

-------------- symlink()—建立文件符号连接

头文件:#include <unistd.h>

定义函数:int symlink(const char * oldpath, const char * newpath);

函数说明:symlink()以参数newpath 指定的名称来建立一个新的连接(符号连接)到参数oldpath 所指定的已存在文件. 参数oldpath 指定的文件不一定要存在, 如果参数newpath 指定的名称为一已存在的文件则不会建立连接.

返回值:成功则返回0, 失败返回-1, 错误原因存于errno.

范例
#include <unistd.h>
main()
{
    symlink("/etc/passwd", "pass");
}


-------------- readlink()—取得符号连接所指的文件

头文件:#include <unistd.h>

定义函数:int readlink(const char * path, char * buf, size_t bufsiz);

函数说明:readlink()会将参数path 的符号连接内容存到参数buf 所指的内存空间, 返回的内容不是以NULL作字符串结尾, 但会将字符串的字符数返回. 若参数bufsiz 小于符号连接的内容长度, 过长的内容会被截断.

返回值:执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于errno.




-------------- chdir()—改变当前的工作目录


头文件:#include <unistd.h>

定义函数:int chdir(const char * path);

函数说明:chdir()用来将当前的工作目录改变成以参数path 所指的目录.

返回值执:行成功则返回0, 失败返回-1, errno 为错误代码.

范例
#include <unistd.h>
main()
{
    chdir("/tmp");
    printf("current working directory: %s\n", getcwd(NULL, NULL));
}

执行:
current working directory :/tmp


-------------- getcwd()—取得当前的工作目录

头文件:#include <unistd.h>

定义函数:char * getcwd(char * buf, size_t size);

函数说明:getcwd()会将当前的工作目录绝对路径复制到参数buf 所指的内存空间,参数size 为buf 的空间大小。

注:
1、在调用此函数时,buf 所指的内存空间要足够大。若工作目录绝对路径的字符串长度超过参数size 大小,则返回NULL,errno 的值则为ERANGE。
2、倘若参数buf 为NULL,getcwd()会依参数size 的大小自动配置内存(使用malloc()),如果参数size 也为0,则getcwd()会依工作目录绝对路径的字符串程度来决定所配置的内存大小,进程可以在使用完次字符串后利用free()来释放此空间。

返回值:执行成功则将结果复制到参数buf 所指的内存空间, 或是返回自动配置的字符串指针. 失败返回NULL,错误代码存于errno.

范例
#include <unistd.h>
main()
{
    char buf[80];
    getcwd(buf, sizeof(buf));
    printf("current working directory : %s\n", buf);
}

执行:
current working directory :/tmp

 

 

 


=========== exit

头文件:#include <stdlib.h>

定义函数:void exit(int status);

函数说明:exit()用来正常终结目前进程的执行, 并把参数status 返回给父进程, 而进程所有的缓冲区数据会自动写回并关闭未关闭的文件.



【汇总】C语言函数
 
=========== atexit

头文件:#include <stdlib.h>

定义函数:int atexit (void (*function) (void));

函数说明:atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main 中返回时, 参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序.

返回值:如果执行成功则返回0, 否则返回-1, 失败原因存于errno 中.

范例
#include <stdlib.h>
void my_exit(void)
{
    printf("before exit () !\n");
}
main()
{
    atexit (my_exit);
    printf("main is done\n");
    exit(0);
}

执行:
main is done
before exit()!


 

 

 

 

 

你可能感兴趣的:(C语言)