0
点赞
收藏
分享

微信扫一扫

c语言部分系统调用函数(shell编程)

头文件

  • <fcntl.h> 文件控制
  • <unistd.h> 符号常量
  • <sys/stat.h> 文件状态
  • <sys/types.h> 基本系统数据类型
  • <utime.h> 文件时间
  • <dirent.h> 目录项

open

头文件:#include <fcntl.h>

#include <sys/stat.h> // 提供open()函数的符号

#include <sys/types.h> // 提供mode_t类型

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 所指的文件并非为一目录,则会令打开文件失败

参数mode 组合

  • S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
  • 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 权限,代表其他用户具有可执行的权限。

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

错误代码

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

read

头文件:#include<unistd.h>

read(int handle,void *buf,int len);

  • int handle 为要读取的文件
  • void *buf 为要将读取的内容保存的缓冲区
  • int len 读取文件的长度

返回值:返回实际读取的字节数,若出错,返回-1。

write

头文件:#include<unistd.h>

write(int handle,void *buf,int len);

  • int handle 为要获取文件指针的文件句柄
  • void *buf 为要写入的内容
  • int len 为要写入文件的长度

返回值:若成功返回已写的字节数,若出错,返回-1。

lseek

头文件:#include <unistd.h>

lseek(int filedes, off_t offset, int whence);

  • int filedes 为要获取文件指针的文件句柄
  • off_t offset 为偏移量
  • nt whence 为偏移位置
    • SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算)
    • SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移
    • SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移

返回值:新的偏移量(成功),-1(失败)

close

头文件:#include <unistd.h>

返回值:关闭成功返回0,失败则返回-1.

creat

头文件:

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>

int creat(const char * pathname, mode_tmode)

  • pathname 为指向欲建立的文件路径字符串
  • mode_tmode 为创建模式,指定用户操作权限
    • S_IRUSR 可读,1
    • S_IWUSR 可写,2
    • S_IXUSR 可执行,4
    • S_IRWXR 可读、写、执行)7(也可以用数字代替,如0777)

Creat()相当于使用下列的调用方式调用open()

open(const char * pathname, (O_CREAT | O_WRONLY | O_TRUNC));

错误提示:

  • EEXIST参数:pathname 所指的文件已存在.
  • EACCESS参数:pathname 所指定的文件不符合所要求测试的权限
  • EROFS:欲打开写入权限的文件存在于只读文件系统内
  • EFAULT参数:pathname 指针超出可存取的内存空间
  • EINVAL参数:mode 不正确.
  • ENAMETOOLONG参数:pathname 太长.
  • ENOTDIR 参数:pathname 为一目录
  • ENOMEM :核心内存不足
  • ELOOP 参数:pathname 有过多符号连接问题.
  • EMFILE:已达到进程可同时打开的文件数上限
  • ENFILE:已达到系统可同时打开的文件数上限

返回值:creat()会返回新的文件描述词, 若有错误发生则会返回-1, 并把错误代码设给errno.

stat

头文件:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char * file_name, struct stat *buf)

  • file_name 为文件名
  • struct stat 的结构体类型

stat结构体:

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 file system I/O */ 包含该文件的磁盘块的大小   
    blkcnt_t  st_blocks;  /* number of 512B 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 */ 最后一次改变该文件状态的时间   
};

stat结构体中的st_mode 则定义了下列数种情况:

    S_IFMT   0170000    文件类型的位遮罩
    S_IFSOCK 0140000    套接字
    S_IFLNK 0120000     符号连接
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     区块装置
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符装置
    S_IFIFO 0010000     先进先出

    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位

    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限

    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限

    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限

    上述的文件类型在POSIX中定义了检查这些类型的宏定义:
    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket
    若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录啦。

st_mode 主要包含了 3 部分信息:
	15-12 位保存文件类型
	11-9 位保存执行文件时设置的信息
	8-0 位保存文件访问权限

mkdir

头文件:#include <direct.h>

int mkdir(const char *path,mode_t mode);

  • path 为创建目录的路径
  • mode 为新创建目录的权限

mode方式:

S_IRWXU 00700权限,代表该文件所有者拥有读,写和执行操作的权限
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,并将错误记录到全局变量errno中。

opendir

头文件:

#include <sys/types.h>

#include <dirent.h>

DIR* opendir(const char* name);

  • name 为打开目录的目录名

DIR结构体:

struct __dirstream   
{   
    void *__fd;    /* `struct hurd_fd' pointer for descriptor.   */
    char *__data;    /* Directory block.   */
    int __entry_data;    /* Entry number `__data' corresponds to.   */
    char *__ptr;     /* Current pointer into the block.   */
    int __entry_ptr;    /* Entry number `__ptr' corresponds to.   */
    size_t __allocation;    /* Space allocated for the block.   */
    size_t __size;    /* Total valid data in the block.   */
    __libc_lock_define (, __lock)    /* Mutex lock for this structure.   */
};   
typedef struct __dirstream DIR;  

返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.

readdir

struct dirent
{
   long d_ino; /* inode number 索引节点号 */
   off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
   unsigned short d_reclen; /* length of this d_name 文件名长 */
   unsigned char d_type; /* the type of d_name 文件类型 */
   char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

fork

头文件:#include <unistd.h>

pid_t pid;
pid = fork();

返回值:

  • 0:子进程的返回值
  • >0:父进程,返回子进程的id号
  • <0:创建进程失败

wait

头函数:#include <wait.h> #include <sys/wait.h>

#incldue <sys/types.h>(提供类型pid_t的定义)

wait();

返回值:

成功返回:回收子进程的id号;

失败返回:-1;

pipe

头函数:#include <unistd.h>

exit

exit(0):正常运行程序并退出程序。
exit(1):非正常运行导致退出程序;

time

localtime

pthread_create

头函数:#include <pyhread.h>

int pthread_create(pthread_t *thread,const pthread_attr_t *attr,const pthread_attr_t *attr,void *arg);

res = pthread_create(&myThread1, NULL, ThreadFun, NULL);

  • pthread_t *thread:传递一个 pthread_t 类型的指针变量,也可以直接传递某个 pthread_t 类型变量的地址。pthread_t 是一种用于表示线程的数据类型,每一个 pthread_t 类型的变量都可以表示一个线程。
  • const pthread_attr_t *attr:用于手动设置新建线程的属性,例如线程的调用策略、线程所能使用的栈内存的大小等。大部分场景中,我们都不需要手动修改线程的属性,将 attr 参数赋值为 NULL,pthread_create() 函数会采用系统默认的属性值创建线程。
  • void *(*start_routine) (void ):以函数指针的方式指明新建线程需要执行的函数,该函数的参数最多有 1 个(可以省略不写),形参和返回值的类型都必须为 void * 类型。void 类型又称空指针类型,表明指针所指数据的类型是未知的。使用此类型指针时,我们通常需要先对其进行强制类型转换,然后才能正常访问指针指向的数据。
  • void *arg:指定传递给 start_routine 函数的实参,当不需要传递任何数据时,将 arg 赋值为 NULL 即可。

返回值:如果成功创建线程,pthread_create() 函数返回数字 0,反之返回非零值。各个非零值都对应着不同的宏,指明创建失败的原因,常见的宏有以下几种:

  • EAGAIN:系统资源不足,无法提供创建线程所需的资源。
  • EINVAL:传递给 pthread_create() 函数的 attr 参数无效。
  • EPERM:传递给 pthread_create() 函数的 attr 参数中,某些属性的设置为非法操作,程序没有相关的设置权限。

以上这些宏都声明在 <errno.h> 头文件中,如果程序中想使用这些宏,需提前引入此头文件。

pthread_join

#include <pthread.h>

int pthread_join(pthread_t thread, void ** retval);

pthread_exit

#include <pthread.h>

void pthread_exit(void *retval);

sleep

头文件:#include <unistd.h>

编辑命令

  • Ctrl + a :移到命令行首
  • Ctrl + e :移到命令行尾
  • Ctrl + f :按字符前移(右向)
  • Ctrl + b :按字符后移(左向)
  • Alt + f :按单词前移(右向)
  • Alt + b :按单词后移(左向)
  • Ctrl + xx:在命令行首和光标之间移动
  • Ctrl + u :从光标处删除至命令行首
  • Ctrl + k :从光标处删除至命令行尾
  • Ctrl + w :从光标处删除至字首
  • Alt + d :从光标处删除至字尾
  • Ctrl + d :删除光标处的字符
  • Ctrl + h :删除光标前的字符
  • Ctrl + y :粘贴至光标后
  • Alt + c :从光标处更改为首字母大写的单词
  • Alt + u :从光标处更改为全部大写的单词
  • Alt + l :从光标处更改为全部小写的单词
  • Ctrl + t :交换光标处和之前的字符
  • Alt + t :交换光标处和之前的单词
  • Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别 [感谢 rezilla 指正]

重新执行命令

  • Ctrl + r:逆向搜索命令历史
  • Ctrl + g:从历史搜索模式退出
  • Ctrl + p:历史中的上一条命令
  • Ctrl + n:历史中的下一条命令
  • Alt + .:使用上一条命令的最后一个参数

控制命令

  • Ctrl + l:清屏
  • Ctrl + o:执行当前命令,并选择上一条命令
  • Ctrl + s:阻止屏幕输出
  • Ctrl + q:允许屏幕输出
  • Ctrl + c:终止命令
  • Ctrl + z:挂起命令

Bang (!) 命令

  • !!:执行上一条命令
  • !blah:执行最近的以 blah 开头的命令,如 !ls
  • !blah:p:仅打印输出,而不执行
  • !$:上一条命令的最后一个参数,与 Alt + . 相同
  • !$:p:打印输出 !$ 的内容
  • !*:上一条命令的所有参数
  • !:p:打印输出 ! 的内容
  • ^blah:删除上一条命令中的 blah
  • ^blah^foo:将上一条命令中的 blah 替换为 foo
  • ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo
举报

相关推荐

0 条评论