聚丁烯pb管:Unix常用函数总结

来源:百度文库 编辑:偶看新闻 时间:2024/03/29 14:13:19

函数名: fgets
功 能: 从流中读取一字符串
头文件: #include
用 法: char * fgets(char * buf, int num, FILE * stream);
NOTE : 按回车将触发fgets从文件接受字符串到buf缓冲区,最大接受字符数为num,且其自动将'\0'填充到接受到的字符缓冲区中, '\0'包含在num指定的字符数目中.

函数名: fputs
功 能: 送一个字符串到一个流中
头文件: #include
用 法: int fputs(char * string, FILE * stream);


unix小知识:对设备文件 /dev/tty 读,相当于读键盘输入;对其写,相当于输出到屏幕

函数名: open
功 能: 打开一个文件用于读或写
头文件: #include
#include
#include
用 法: int open(char * pathname, int how); //how 为 O_RDONLY , O_WRONLY, O_RDWR

函数名: read
功 能: 从文件中读
头文件: #include
用 法: int read(int fd, void *buf, int nbyte);

函数名: write
功 能: 写到一文件中
头文件: #include
用 法: int write(int fd, void *buf, int nbyte);

函数名: close
功 能: 关闭文件句柄
头文件: #include
用 法: int close(int fd);

unix小知识:
1. /var/adm/utmp 保存了所有用户的登陆信息,其信息结构描述是在/usr/include/utmp.h中描述,可以用UTMP_FILE代指utmp文件的路径,因为在utmp.h中用宏定义了#define UTMP_FILE "/var/adm/utmp"

2.utmp结构体类型中有个ut_type字段,其含义为用户是否已登陆,若其值为7(#define USER_PROCESS 7),则代表该用户已登陆。

3.在/usr/include/time.h中时间类型的定义为(typedef long int time_h;),则隐含时间是个长整型的类型,在unix中有一个函数ctime()可以将整数值的时间转化为人们日常所使用的时间形式(如: Jun 30 21:49:08 1993)其声明如下:

函数名: ctime
功 能: 把日期和时间转换为字符串
头文件: #include
用 法: char *ctime(const time_t *time);

函数名: creat
功 能: 创建一个新文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件的长度设置为0
头文件: #include
返回值: 返回值是个整数fd,如果成功则返回文件的描述符,如果失败则返回-1
用 法: int creat (const char *filename, int permiss);
permiss:为9段的文件允许位(rwxr--r--之类的),可用三个八进制数代替如(0644,0代表644是个8进制数)

unix小知识:umask命令可以更改文件"新建文件掩码值",他指定哪些位需要被关闭.
例如: umask 022(----w--w-),就可以防止程序创建能被同组用户和其他用户修改的文件.


函数名: write
功 能: 将内存中的数据写入文件
头文件: #include
返回值: 遇到错误返回-1 ,成功写入返回 number written
用 法: int write(int fd, void *buf, int nbyte);

函数名: lseek
功 能: 移动文件读/写指针
头文件: #include
#include
用 法: long lseek(int fd, off_t offset, int base);
返回值: 遇到错误(-1),指针变化前的位置(oldpos)
base:有三种选择SEEK_SET(文件开始),SEEK_CUR(当前位置),SEEK_END(文件结尾)


unix小知识: 返回值-1表示系统调用在运行中出了些差错,一旦检测到错误必须做相应的处理
内核通过全局变量errno来指明错误的类型,每个程序都可以访问到这个变量,可以通过
man 3 errno来查看出错编号的含义


函数名: opendir
功 能: 打开一个目录
头文件: #include
#include
用 法: DIR * opendir(const char *name);

函数名: readdir
功 能: 读目录项的内容
头文件: #include
#include
用 法: struct dirent * readdir(DIR * dir);
返回值: 返回一个目录项的首地址
struct dirent{
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};


函数名: stat
功 能: 得到文件的属性
头文件: #include
#include
#include
用 法: int stat(char *pathname, struct stat *buff);
返回值: -1遇到错误;0成功返回
struct stat {
              dev_t     st_dev;     /* ID of device containing file */
              ino_t     st_ino;     /* inode number */
              mode_t    st_mode;    /* protection */
              nlink_t   st_nlink;   /* number of hard links */
              uid_t     st_uid;     /* user ID of owner */
              gid_t     st_gid;     /* group ID of owner */
              dev_t     st_rdev;    /* device ID (if special file) */
              off_t     st_size;    /* total size, in bytes文件大小 */
              blksize_t st_blksize; /* blocksize for filesystem I/O */
              blkcnt_t st_blocks; /* number of blocks allocated */
              time_t    st_atime;   /* time of last access */
              time_t    st_mtime;   /* time of last modification */
              time_t    st_ctime;   /* time of last status change */
          };

函数名: sscanf
功 能: 执行从字符串中的格式化输入
用 法: int sscanf(char *string, char *format, ... );


unix小知识: 若要找某个数据结构的定义,可以在shell下输入man -k <关键字>


函数名: getpwuid
功 能: 使用uid(user ID)作为参数返回一个指向struct passwd的指针
头文件: #include
#include
用 法: struct passwd * getpwuid(uid_t uid);
返回值: 出错则返回NULL,成功则返回指向struct passwd的指针

/* The passwd structure. */
struct passwd
{
char *pw_name;   /* Username. */
char *pw_passwd;   /* Password. */
__uid_t pw_uid;   /* User ID. */
__gid_t pw_gid;   /* Group ID. */
char *pw_gecos;   /* Real name. */
char *pw_dir;    /* Home directory. */
char *pw_shell;   /* Shell program. */
};

函数名: getgrgid
功 能: 使用gid(group ID)作为参数返回一个指向struct group的指针
头文件: #include
#include
用 法: struct group * getgrgid(gid_t gid);
返回值: 出错则返回NULL,成功则返回指向struct group的指针

/* The group structure. */
struct group
{
    char *gr_name;   /* Group name. */
    char *gr_passwd;   /* Password. */
    __gid_t gr_gid;   /* Group ID. */
    char **gr_mem;   /* Member list. */
};


函数名: chmod
功 能: 改变文件的访问模式(rwxrwxrwx)
头文件: #include
#include
用 法: int chmod(char * path,mode_t mode);
返回值: -1遇到错误,0成功返回,此系统调用不受"新建文件掩码"(umask)的影响
e.g. : chmod("/tmp/myfile",04764);


函数名: chown
功 能: 改变文件的访问模式(rwxrwxrwx)
头文件: #include
用 法: int chown(char * path,uid_t owner,gid_t group);
返回值: -1遇到错误,0成功返回,如果后两个参数都为-1,那么文件所有者和组都不会改变。
文件所有者可以把文件的组改成任何一个他所属的组。


函数名: utime
功 能: 修改文件最后修改时间和最后访问时间
头文件: #include
#include
#include
用 法: int utime(char * path,struct utimbuf * newtimes);
返回值: -1遇到错误,0成功返回

/* Structure describing file times. */
struct utimbuf
{
    __time_t actime;   /* Access time. */
    __time_t modtime;   /* Modification time. */
};

unix小知识: 用touch命令可以修改文件的最后访问时间和最后修改时间

函数名: rename
功 能: 修改文件/目录的名字或移动文件的位置
头文件: #include
用 法: int rename(char * old,char * new);
返回值: -1遇到错误,0成功返回
tips: 命令mv即调用此函数


函数名: mkdir
功 能: 创建一个目录
头文件: #include
#include
用 法: int mkdir(const char * pathname,mode_t mode);
返回值: -1遇到错误,0成功返回
tips: mode 即为权限位的掩码


函数名: rmdir
功 能: 删除一个目录,此目录必须为空
头文件: #include
用 法: int rmdir(const char * path);
返回值: -1遇到错误,0成功返回
tips: path 即为目录名,且这个目录必须为空。如果这个目录并未被其他的任何进程占用,它的i节点和数据块将被释放。


函数名: unlink
功 能: 删除一个链接(此处指的是硬链接)
头文件: #include
用 法: int unlink(const char * path);
返回值: -1遇到错误,0成功返回
tips: 命令rm即是调用此函数来删除文件。unlink用来删除目录文件中的一个记录,减少相应i节点的链接数。如果该i节点的链接数减为0,数据块和i节点将被释放。unlink不能被用来删除目录。


函数名: link
功 能: 创建一个文件的新链接(此处指的是硬链接)
头文件: #include
用 法: int link(const char * oldpath,const char * newpath);
返回值: -1遇到错误,0成功返回
tips: 命令ln即调用此函数。

函数名: chdir
功 能: 改变所调用进程的当前目录
头文件: #include
用 法: int chdir(const char * path);
返回值: -1遇到错误,0成功返回
tips: 命令cd即调用此函数。

函数名: strncpy
功 能: 串拷贝
用 法: char *strncpy(char * dest, char * src, int maxlen);
Note: 此串拷贝只是简单的按照maxlen规定从源串拷贝到目的串, 所以需要手动将目的串后加'\0'


函数名: perror
功 能: 根据全局变量errno的值,打印一个系统错误消息
头文件: #include
#include //errno 的定义在此头文件中
用 法: void perror(const char *s);
返回值: -1遇到错误,0成功返回
例如 : 若此时errno的值为10 ,则调用perror("hello!");后则屏幕输出如下信息:
hello!: No child processes


函数名: symlink
功 能: 为原始文件创建一个符号链接
头文件: #include
用 法: int symlink(const char *path1,const char * path2);
返回值: -1遇到错误,0成功返回
NOTE : 注意path2为符号链接文件的路径,path1为源文件的路径
ln -s 即调用此函数


函数名: readlink
功 能: 读取符号链接的值(其实就是读取原始文件的路径字符串)
头文件: #include
用 法: int readlink(const char * path,char * buf,size_t bufsiz);
返回值: 若成功则返回放到缓冲buf里的字符个数,若失败则返回-1
NOTE : 此函数读取符号链接字串的前bufsiz个字符,到缓冲buf中,且此函数并不会为保存到buf中的字符串后面添加'\0',需要你自己添加


unix小知识: man 命令可查找到很多有用的东西, 文档1为命令部分,2为系统调用部分。3为标准C函数部分

///////////////////////////////////////////////////////////////////////////////////////
目前还不懂的地方:

1.设备文件的i节点存储的是指向内核子程序的指针,而不是文件的大小和存储列表。内核中传输设备数据的子程序被称为设备驱动程序。

2.如用ls命令显示但前终端文件的详细信息有如下:
crw--w---- 1 root tty 136, 0 May 16 17:58 /dev/pts/0
其中的“136, 0” 表示的是 从终端进行数据传输的代码是在设备——进程表中编号为136
的子程序。该子程序接受一个整形参数。在/dev/pts/0 中,参数是0 。136和0这两个数被
称为设备的主设备号和次设备号。
主设备号确定处理该设备实际的子程序,
而从设备号被作为参数传输到该子程序。
3.每个i节点编号指向i节点表中的一个结构。i节点可以是磁盘文件的也可以是设备文件的。i节点的类型被记录在结构stat的成员变量st_mode的类型区域中。
    磁盘文件的i节点包含指向数据块的指针。设备文件的i节点包含指向内核子程序表的指针。主设备号用于告知从设备读取数据的那部分代码的位置。
   
///////////////////////////////////////////////////////////////////////////////////////

函数名: fcntl
功 能: 控制文件描述符
头文件: #include
#include
#include
用 法: int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lockp);
参数 : cmd需进行的操作,arg操作的参数,lockp锁信息
返回值: -1遇到错误,other 依操作而定

举例:
1.关闭内核对fd描述符的缓冲机制

#include
int s;
s = fcntl(fd,F_GETFL);
s |= O_SYNC;
result = fcntl(fd,F_SETFL,s);
if( result == 1 )
perror("setting SYNC");

2.自动添加模式(为了避免同一时刻两个进程对同一文件的操作,也即"竞争",内核提供了一个简单的解决办法:自动添加模式。当文件描述符的O_APPEND位被开启后,每个对write的调用自动调用lseek将内容添加到文件末尾。)

#include
int s;
s = fcntl(fd,F_GETFL);
s |= O_APPEND;
result = fcntl(fd,F_SETFL,s);
if( result == 1 )
perror("setting APPEND");
else
write(fd,&rec,1);


unix小知识: 用open函数也可以控制文件描述符如:
     fd = open(WTMP_FILE,O_WRONLY | O_APPEND | O_SYNC);
open支持的其他标志位:
O_CREAT 如果不存在,创建该文件。
O_TRUNC 如果文件存在,将文件长度置0
O_EXCL O_EXCL标志位防止两个进程创建同样的文件。如果文件存在且O_EXCL被置位,则返   回-1.

unix命令:
stty命令可以读取和修改驱动程序的设置
stty 显示终端配置信息
stty -all 显示所有配置信息
stty -echo 消除键盘回显 stty echo 打开键盘回显

函数名: tcgetattr
功 能: 读取tty驱动程序的属性
头文件: #include
#include
用 法: int tcgetattr(int fd,struct termios * info);
返回值: -1遇到错误,0成功返回
NOTE : info指向终端结构的指针


函数名: tcsetattr
功 能: 设置tty驱动程序的属性
头文件: #include
#include
用 法: int tcsetattr(int fd,int when,struct termios * info);
返回值: -1遇到错误,0成功返回
NOTE : info指向终端结构的指针,when改变设置的时间

when的允许值如下:
(1)TCSANOW 立即更新驱动程序设置
(2)TCSADRAIN 和 TCSAFLUSH 等等

struct termio
{
unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};

小知识: 若要查找termios中的域变量的详细用法请参考man tcgetattr

例子 : 以下代码为一个连接开启字符回显
#include
struct termios settings;
tcgetattr(fd,&settings);
settings.c_lflag |= ECHO;
tcsetattr(fd,TCSANOW,&settings);


函数名: ioctl
功 能: 控制一个设备
头文件: #include
用 法: int ioctl(int fd,int operation [,arg ...]);
返回值: -1遇到错误,other依错误而定
NOTE : operation需进行的操作,操作所需的参数

缓冲和编辑包含规范处理(canonical processing)。当这些特征被启动时,终端连接被称为处于规范模式。

函数名: strchr
头文件: #include
功 能: 在一个串中查找给定字符的第一个匹配之处
用 法: char * strchr(char *str, char c);
返回值: 返回字符串中第一个匹配字符的地址


函数名: signal
功 能: 简单的信号处理
头文件: #include
用 法: int signal(int signum,void (* action)(int) );
返回值: -1遇到错误,prevaction 成功返回
NOTE : SIG_IGN 忽略信号 SIG_DFL 将信号恢复为默认处理


函数名: alarm
功 能: 设置发送信号的计时器
头文件: #include
用 法: unsigned old = alarm(unsigned seconds);
返回值: -1遇到错误,old 计时器剩余时间
说 明: alarm设置本进程的计时器到seconds秒后激发信号。当设定的时间过去后,内核发送SIGALRM到这个进程。如果计时器已被,alarm返回剩余秒数(注意: 调用alarm(0)意味着关掉闹钟)


函数名: pause
功 能: 等待信号
头文件: #include
用 法: result = pause();
返回值: 总是-1

***************************************************************************************
         * 以下为网络函数 *      
***************************************************************************************

函数名: htonl
htons
功 能: 主机字节序到网络字节序的转化
头文件: #include
用 法: unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
返回值: 按照网络字节顺序的值


函数名: ntohl
ntohs
功 能: 网络字节序到主机字节序的转化
头文件: #include
用 法: unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
返回值: 按照主机字节顺序的值


函数名: inet_aton
功 能: 点分十进制字符串到32位的IP地址(此IP地址为网络字节序)
头文件: #include
用 法: int inet_aton(const char * cp,struct in_addr * inp);
返回值: 若成功则返回1,出错则返回0

IP地址结构体的定义:
/* Internet address structure */
struct in_addr {
unsigned int s_addr; /* network byte order(big-endian) */
};


函数名: inet_ntoa
功 能: 32位的IP地址(此IP地址为网络字节序)到点分十进制字符串
头文件: #include
用 法: char * inet_ntoa(strct in_addr in);
返回值: 指向点分十进制的字符串的首地址

函数名: gethostbyname
功 能: 由主机名(hostname)得到hostent结构体信息的首地址(其定义如下)
头文件: #include
用 法: struct hostent * gethostbyname(const char * name);
返回值: 若成功则返回得到的hostent结构的首地址,出错则返回NULL指针,同时置h_errno

函数名: gethostbyaddr
功 能: 由32位的IP地址得到hostent结构体信息的首地址(其定义如下)
头文件: #include
用 法: struct hostent * gethostbyaddr(const void * addr,int len,0);
返回值: 若成功则返回得到的hostent结构的首地址,出错则返回NULL指针,同时置h_errno

struct hostent
{
char *h_name;    /* Official name of host. */
char **h_aliases;   /* Alias list. */
int h_addrtype;   /* Host address type. */
int h_length;    /* Length of address. */
char **h_addr_list;   /* List of addresses from name server. */
};