1. 执行新程序
只列出几个常用的函数:
#include <unistd.h>
int execve(const char *path, char * const argv[], char * const envp[]);//envp[]为环境变量,可直接调用
int execv(const char *path, char * const argv[]);//与execve()类似
int execvp(const char * path, char * const argv[]);//path新程序的名称
正常情况下,这些函数不会返回,因为进程的执行映像已经被替换,没有剖接收返回值的地方。若发生错误,则返回-1.
新程序的进程保持了原来进程的进程ID、父进程ID、实际用户ID和用户组ID。同时,调用新程序后,原有的子进程的映像被替代,不再被执行。
2. 等待进程结束
#include <sys/types.h>
#include <wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
/*
参数statloc指向的变量存放子进程的退出码(int型),即从子进程main函数返回的值或子进程中exit函数的参数
*/
wait/waitpid
有关宏定义:
WIFEXITED(stat_val) : 子进程正常结束,该宏返回非零值;有异常,返回0
WEXITSTATUS(stat_val) : 获取子进程的退出码
由于stat_val的信息存储在其二进制,难以直接读取,故用宏来获取退出码。(子进程若exit(num)
, 则获取的退出码即num
)
3. 进程ID
#include <sys/types.h>
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
若进程具有root权限,则函数将实际用户ID、有效用户ID设置为uid;
若进程不具有root权限,但uid等于实际用户ID,则致敬有效用户ID设为uid;
若两个条件都不满足,函数调用是失败,返回 -1 .
只有超级用户进程才可以改变实际用户ID.内核对进程存取文件的许可权的检查,是通过检查进程的有效用户ID来实现的,所以普通用户可以通过暂时获得root权限来操作文件。
4. 实现shell过程中的操作
1)readline函数库
调用该函数库可直接实现命令行方向键的使用、光标移动、自动补全、查看命令历史记录。
int main()
{
char* input, shell_prompt[100];
rl_bind_key('\t', rl_complete);
for(;;) {
snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));
input = readline(shell_prompt);
if (!input)
add_history(input);
free(input);//数组不用后要释放,避免内存泄露
}
}
2) vfork使用注意事项
因为用vfork
创建的子进程与父进程共享资源,包括堆栈区等数据,如果在子进程使用return
结束进程,在进程结束后系统会回收该进程锁占用的资源,也就导致父进程在继续运行时之前所有资源都已“消失”,会发生段错误,而使用exit
退出时,则是直接退出进程,不会进行资源的回收,所以不会出错。
3) Linux终端printf控制输出颜色及格式
格式:
printf(“\033[字背景颜色;字体颜色m字符串\033[0m” );
printf(“\033[41;32m字体背景是红色,字是绿色\033[0m\n”);
41是字背景颜色, 32是字体的颜色, 字体背景是红色,字是绿色是字符串. 后面的\033[0m是控制码.
颜色代码:
字背景颜色范围: 40--49 字颜色: 30--39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
ANSI控制码:
\033[0m 关闭所有属性
\033[1m 设置高亮度
\03[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m – \033[37m 设置前景色
\033[40m – \033[47m 设置背景色
\033[nA 光标上移n行
\03[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\33[?25h 显示光标
友情链接:
http://blog.csdn.net/yi412/article/details/46867137
http://www.linuxidc.com/Linux/2011-03/32903.htm