app开发者平台在数字化时代的重要性与发展趋势解析
602
2022-10-04
unix环境编程练习 (2)
系统调用
系统调用是由操作系统核心提供,运行于核心态;普通函数调用由库函数或者用户自定义,处于用户态。那些标准函数都是由系统调用完成的。 查看系统调用的接口:
[edemon@CentOS ~]$ man 2
进程不能访问内核,系统调用则是接口,由他们告诉内核进程的请求是什么。
错误码
errno: 1–34存在于: /usr/include/asm-generic/errno-base.h errno: 35–133记录在: /usr/include/asm-generic/errno.h
#define#define#define#define#define EIO 5 /* I/O error#define#define#define ENOEXEC 8 /* Exec format error#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define EADV 68 /* Advertise error#define ESRMNT 69 /* Srmount error#define ECOMM 70 /* Communication error#define EPROTO 71 /* Protocol error#define#define EDOTDOT 73 /* RFS specific error#define#define#define#define#define#define#define#define#define#define#define#define#define ESTRPIPE 86 /* Streams pipe error#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define EREMOTEIO 121 /* Remote I/O error#define#define#define#define#define#define#define#define/* for robust mutexes */#define#define#define#define EHWPOISON 133 /* Memory page has hardware error
系统调用部分函数练习
writev
将多个字符串一次性全部写入文件中。 函数相关:
#include
例子:
#include
readv
与writev()相反的函数。它一次能读取数据到多个字符数组中。函数和writev一样。 ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
#include
执行
[edemon@CentOS workspace]$ gcc readv.c[edemon@CentOS workspace]$ ./a.out My song for you this eveningIt's not to make you sadNot for adding to
lseek, dup
lseek()用于重置光标位置。dup()则是赋值文件描述符。
off_t lseek(int fd, off_t offset, int whence);int dup(int
下面的例子是打开文件txt,描述符是fd,写入”hello world” 复制文件描述符成new_fd,隔行写入”this is new_fd”. 最后读取文件内容。
#include
执行:
hello worldthis is
poll
poll和select相似,用于等待fd集状态的改变。 int poll(struct pollfd *fds, nfds_t nfds, int timeout);
#include 编译运行: $ ./a.out test1, buff is : hello worldtest2, buff is access 检查文件是否有相应的权限。int access(const char *pathname, int mode); 比如检查文件/tmp/linux 是否存在: #include chdir chdir用以改变程序的工作目录。 int chdir(const char *path); #include 编译执行: [edemon@CentOS workspace]$ ./a.out /home/edemon/workspace symlink readlink symlink用于建立新的(符号)连接,readlink用于查看符号连接内容(对象的名字)。 int symlink(const char *target, const char *linkpath);ssize_t readlink(const char *path, char 正常执行后buff即含有内容信息。 #include 执行: [edemon@CentOS workspace]$ ./a.out read buff: read[edemon@CentOS workspace]$ ls -l readlinklrwxrwxrwx. 1 edemon edemon 4 Dec 15 20:19 readlink -> read link link创建一个文件的(硬)连接。 int link(const char *oldpath, const char *newpath); #include 软连接和硬连接的区别:如果将源文件删除了,软连接文件是不能访问的,但是硬连接文件仍然正常;软连接可以跨磁盘分区,但是硬连接不能。 remove int remove(const char *pathname); 如果pathname是一个文件,unlink会被调用;如果pathname是文件夹,那么rmdir则会被调用。 #include opendir readdir DIR *opendir(const char *name); DIR*是一种目录流。 struct dirent *readdir(DIR *dirp); readdir的返回值是指向struct dirent的指针。 struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* not an offset; see NOTES */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all filesystem types */ char d_name[256]; /* filename */ 在dirent.h中说明了d_type: /* File types for `d_type'. */enum { DT_UNKNOWN = 0,# define DT_UNKNOWN DT_UNKNOWN DT_FIFO = 1,# define DT_FIFO DT_FIFO DT_CHR = 2,# define DT_CHR DT_CHR DT_DIR = 4,# define DT_DIR DT_DIR DT_BLK = 6,# define DT_BLK DT_BLK DT_REG = 8,# define DT_REG DT_REG DT_LNK = 10,# define DT_LNK DT_LNK DT_SOCK = 12,# define DT_SOCK DT_SOCK DT_WHT = 14# define DT_WHT DT_WHT 查找当前目录下所有的文件夹: #include index, rindex index用于寻找字符串中第一个出现的指定字符串。 char *index(const char *s, int c); rindex用于查找字符串中最后一个出现的指定字符。 char *rindex(const char *s, int c); #include 和index相似的函数memchr用于在s所指内存中前n个字节查找有木有c存在。void *memchr(const void *s, int c, size_t n); memmove void *memmove(void *dest, const void *src, size_t n); 内存拷贝函数memmove和memcpy都是用于复制src前n个字节到dest中. #include strcasecmp strcasecmp()是一个可以忽略大小写比较的函数,这在某些数据库密码验证中很有用。 int strcasecmp(const char *s1, const char *s2); 例如: #include strcspn, strspn size_t strcspn(const char *s, const char *reject); strcspn用于统计源字符串s中不含指定字符串reject中字符的连续字符个数。 size_t strspn(const char *s, const char *accept); 与之相反是strspn,它用于统计包含accept字符串中字符的连续字符的个数。 #include strdup strdup会先malloc出一块内存,然后将字符串拷贝到该内存,最后将相应的指针返回。该内存可以被free. #include strpbrk char *strpbrk(const char *s, const char *accept); strpbrk()用于查找在s中第一个出现在accept中的字符的位置。 #include strstr char *strstr(const char *haystack, const char *needle); strstr用于确定子字符串的位置。和index相比,第二个参数不是char,而是string. strtok char *strtok(char *str, const char *delim); strtok()用于将字符串分割成不同的片段,它在参数s字符串中发现delim中的字符后将之变成0,第一次调用时必须给于str字符串参数,之后的调用将其设置成NULL,每一次调用成功将会返回下一个指向待分割字符串的指针。 #include ctime char *ctime(const time_t *timep); ctime用于将指向time_t的指针信息转化成字符串时间格式。我们需要先获取它的参数,可以通过time_t time(time_t *t);实现,time() returns the time as the number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). #include 字符串转化成数值 function format introduce atof double atof(const char *nptr); convert a string to a double atoi int atoi(const char *nptr); convert a string to an int integer atol long atol(const char *nptr); convert a string to an long integer atoll long long atoll(const char *nptr); convert a string to an long long integer gcvt char *gcvt(double number, size_t ndigit, char *buf); 浮点数转化成字符串,四舍五入。函数返回buf指针所指空间。 #include toascii int toascii(int c); toascii()用于将参数c转化成转化成7位无符号char型数值,参数的高位将被抹去。 比如: #include 1000000002⟶010⟶NUL0111111112⟶12710⟶DEL 让我感觉奇怪的是DEL不是删除右边字符吗,为什么这里变成删除左边的(了?
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~