与shell命令相关函数调用
linuxC
dup 和 dup2 函数
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd)
dup用来复制oldfd所指的文件描述符。当复制成功时返回最小的尚未被使用的文件描述符。若有错误则返回-1,错误代码存入errno中。返回的新文件描述符和参数oldfd指向同一个文件,共享所有的锁定,读写指针,和各项权限或标志位。 (类似于链接)
dup2可以用参数newfd指定新文件描述符的数值。若newfd已经被程序使用,系统就会将其关闭以释放该文件描述符;若newfd与oldfd相等,dup2将返回newfd,而不关闭他。dup2调用成功返回新的文件描述符,出错则返回-1。 (重定向)
标准输入(stdin),标准输出(stdout),标准出错信息(stderr)的文件号分别为0,1,2。
例如,使用了dup(newfd,1)后,控制台输出的信息会全部被输出到文件描述符newfd所对应的文件上,而控制台不再输出信息,因为控制台所对应的文件描述符已经被关闭了。
my_shell 实现重定向时父进程等待子进程中,逻辑关系:
在printf中改变字符串的颜色
printf( "\033[1;31;40m 输出红色字符 \033[0m" )
\033[显示方式;前景色;背景色m
文件描述符
文件描述符是一个比较重要的概念,它和输入和输出密切相关
Linux标准文件描述符:
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误输出
Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。其实我们可以想象我们电脑的显示器和键盘在Linux系统中都被看作是文件,而它们都有相应的文件描述符与之对应。
其实我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。那么我们可以把上面表格中的文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘的; 文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器的; 文件描述符2理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置
ps:open函数如果成功打开会返回所打开文件的文件描述符。
获取详细的用户信息
系统文件/etc/passwd包含一个用户帐号数据库。它由行组成,每行对应一个用户,包括:
用户名、加密口令、用户标识符(UID)、组标识符(GID)、全名、主目录和默认shell。
编程接口的数据结构:
strcut passwd {
char *pw_name;
char *pw_passwd;
uid_t pw_uid;
gid_t pw_gid;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
}
#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
这两个函数都返回一个指针,指向passwd结构。出错时,返回NULL,并设置errno。
我们可以由uname系统调用得到关于主机的更为详细的信息:
#include <sys/utsname.h>
int uname(struct utsname *name);
成员 描述
char sysname[] 操作系统名
char nodename[] 主机名
char release[] 系统发行级别
char version[] 系统版本号
char machine[] 硬件类型
```#include
int gethostname(char *name, size_t namelen);
readline() //注:括号中的参数是提示符!
安装
在deepin下可以用这个命令(Ubuntu和deepin一样)
sudo apt-get install libreadline6-dev
原型
#include <readline/readline.h>
#include <readline/history.h>
①char *readline (const char *prompt);//返回值就是读取的字符串
②void add_history(const char *string);//用来返回历史
③typedef char *rl_compentry_func_t(const char *text, int state);
④char **rl_completion_matches(const char *text, rl_compentry_func_t *entry_func);