二十六、Linux 进程与信号---system 函数 和进程状态切换
26.1 system 函数
26.1.1 函数说明
system(执行shell 命令)
相关函数 fork,execve,waitpid,popen
#include <stdlib.h>
int system(const char * string);
- 函数功能:简化 exec 函数
- 函数说明
- system()会调用 fork() 产生子进程,由子进程来调用 /bin/sh -c string 来执行参数 string 字符串所代表的命令,此命令执行完后随即返回原调用的进程。
- 在调用 system() 期间 SIGCHLD 信号会被暂时搁置,SIGINT 和 SIGQUIT 信号则会被忽略。
- 等同于 /bin/bash -c "cmd" 或者 exec("bash", "-c", "cmd")
- 返回值
- 如果 system()在调用 /bin/sh 时失败则返回 127,其他失败原因返回-1。
- 若参数 string 为空指针(NULL),则返回非零值。
- 如果system()调用成功则最后会返回执行 shell 命令后的返回值,但是此返回值也有可能为 system()调用 /bin/sh 失败所返回的 127,因此最好能再检查 errno 来确认执行成功。
- 附加说明
- 在编写具有SUID/SGID权限的程序时请勿使用 system(),system() 会继承环境变量,通过环境变量可能会造成系统安全的问题。
26.1.2 system 应用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> char *cmd = "date"; int main(void)
{
system("clear");
system(cmd); return ;
}
编译执行
26.1.3 构建 mysystem 命令
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> char *cmd1 = "date > s1.txt";
char *cmd2 = "date > s2.txt"; void mysystem(char *cmd)
{
pid_t pid;
if((pid = fork()) < ) {
perror("fork error");
exit();
} else if(pid == ) {
if(execlp("/bin/bash", "/bin/bash", "-c", cmd ,NULL) < ) {
perror("execlp error");
exit();
}
} wait();
} int main(void)
{
system("clear");
system(cmd1); mysystem(cmd2); return ;
}
编译调试
26.6 进程状态切换
- runnable:就绪状态
- running:运行状态
- block/suspend:阻塞或挂起状态
- dead:终止状态。正在运行的状态调用 return/exit_exit 进入 dead 状态
- os scheduler:系统调度
二十六、Linux 进程与信号---system 函数 和进程状态切换的更多相关文章
- 二十、Linux 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...
- Linux学习之CentOS(二十六)--Linux磁盘管理:LVM逻辑卷的创建及使用
在上一篇随笔里面 Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理, ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程
23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...
- 二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- 二十四、Linux 进程与信号---wait 函数
24.1 wait 函数说明 24.1.1 waitpid---等待子进程中断或结束 waitpid(等待子进程中断或结束) 相关函数 wait,fork #include <sys/types ...
- 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...
- 二十一、Linux 进程与信号---进程资源限制
21.1 进程资源限制 在操作系统中,我们能够通过函数getrlimit().setrlimit()分别获得.设置每个进程能够创建的各种系统资源的限制使用量. 21.1.1 函数 #include & ...
- 二十七、Linux 进程与信号---进程组和组长进程
27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...
随机推荐
- 「TJOI2015」组合数学 解题报告
「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...
- Nginx+Keepalived部署
-----------ReProxy-------------------------Client-----------192.168.56.200 nginx+keepalived 192.168. ...
- 生产者&消费者.py
1.最简单的 --生产者消费者 send.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai' ...
- Gym-100451B:Double Towers of Hanoi
题目链接 题目大意:把汉诺双塔按指定顺序排好的最少步数 我写这题写了很久...终于发现不dp不行 把一个双重塔从一根桩柱移动到另一根桩柱需要移动多少次? 最佳策略是移动一个双重 (n-1) 塔,接着移 ...
- UDS(ISO14229-2006) 汉译(No.7 应用层协议)
标签:cte amp 通信 pac condition man 没有 参数错误 family 7.1定义 应用层协议通常作为确认消息的传输,意味着从客户端发送的每一个请 ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- JavaWeb基础之Servlet简单实现用户登陆
学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...
- vue--传值
传值:(如果传的是引用类型,当值发生改变时所有绑定他的全都发生改变,如果传的时值类型,就只有他自己发生改变) 父传子: 父页面:父组件定义一个属性 users:[ {name:'张三',positio ...
- Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)
1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa- ...
- golang与vscode的安装与配置
一.golang的下载与安装 以下都是win10的安装与配置 go语言官方下载地址:https://golang.org/dl/ 找到适合你系统的版本下载 傻瓜式安装开始... 二.golang环境变 ...