进程控制 (二) & Others

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值