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--3940: 黑                           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