讲述Linux进程状态如何切换,二十六、Linux 进程与信号---system 函数 和进程状态切换...

26.1 system 函数

26.1.1 函数说明

system(执行shell 命令)

相关函数 fork,execve,waitpid,popen

#include

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

#include

#include

char *cmd = "date";

int main(void)

{

system("clear");

system(cmd);

return ;

}

编译执行

5f3379f608184169cc269579e4135ff1.png

26.1.3 构建 mysystem 命令

#include

#include

#include

#include

#include

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 ;

}

编译调试

3dffb42ad310d4a3f3d3d44821855ae9.png

26.6 进程状态切换

2f9653eb8efb1d85eea33c23b712a901.png

runnable:就绪状态

running:运行状态

block/suspend:阻塞或挂起状态

dead:终止状态。正在运行的状态调用 return/exit_exit 进入 dead 状态

os scheduler:系统调度

二十、Linux 进程与信号---非局部跳转

20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...

Linux学习之CentOS&lpar;二十六&rpar;--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

二十一、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 进程组的消亡要 ...

随机推荐

matplotlib作图中文显示问题

def set_ch(): from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcPa ...

ext combobox getValue

使用combobox时,它有一个hiddenName的属性,专门用于提交combobox中value的值. 现假设某combobox的Id为comboId,hiddenName属性的值为hiddenV ...

用javascript操作xml

用javascript操作xml 可以使用标准DOM操作. IE创建XML MSXML2.0DOMDocument function createXMLDOM(){ var version = [ ' ...

C&plus;&plus;11中int&comma;float&comma;double与string的转化

在C++11中可以使用std::to_string()函数将数值转换为string格式,十分方便. 以下部分来选自cplusplus.com. std::to_string string to_str ...

【原创】Libjpeg 库使用心得(一) JPEG图像DCT系数的获取和访问

[原创]继续我的项目研究,现在采用Libjpeg库函数来进行处理,看了库函数之后发现C语言被这些人用的太牛了,五体投地啊...废话不多说,下面就进入正题. Libjpeg库在网上下载还是挺方便的,这里 ...

Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...

Java基础之 反射是什么?

什么是反射,反射能干嘛? 反射是:指程序可以访问.检测和修改它本身状态或行为的一种能力 反射是一种能力,所以给的定义就是说明了它能干嘛. 我们平时用反射主要做: 获取类型的相关信息 动态调用方法 动态 ...

用deepin堆砌工作环境

用deepin堆砌工作环境 这篇文章记录了我用 deepin 15.5搭建工作环境的过程,供我个人在未来重装系统时参考.对于其他以 deepin 操作系统作为主要工作平台的看官,咱们是相亲相爱的一家人 ...

【iCore1S 双核心板&lowbar;FPGA】例程四:TCL脚本实验——配置引脚

代码包下载: 链接:http://pan.baidu.com/s/1o8G62im 密码:j0iq

vue 之 Vue&period;extend&lpar;&rpar;

Vue.extend( options ) 参数: {Object} options 用法: 使用基础 Vue 构造器,创建一个“子类”.参数是一个包含组件选项的对象. data 选项是特例,需要注意 ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值