二十六、Linux 进程与信号---system 函数 和进程状态切换
2024-10-18 23:29:44
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:系统调度
最新文章
- 一、jquery简介
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service &; Client
- SQL增删查改注意的事项
- linux服务开机启动顺序
- Mac系统如何配置adb
- 怎样修改Windows7环境变量
- 修改placeholder颜色
- Python一些字符串判断和转换
- DP——由蒟蒻到神犇的进阶之路
- [JSOI2007]麻将
- 【Unity】微软的一款依赖注入组件
- Scrapy案例02-腾讯招聘信息爬取
- Flask Mysql数据库连接
- IP保留地址
- [JLOI 2016]成绩比较
- BGP - 4,BGP的三张表
- python3解析库pyquery
- delphi 获取一个字符占用几个字节,方法
- (原)用WebBrowser浏览Office Web Apps Server,除去“下载”按钮
- 【App性能】:TraceView分析法
热门文章
- 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)
- AITP
- P1637 三元上升子序列
- [bzoj1717][Milk Patterns 产奶的模式]
- [luoguU48834][count]
- SQL问题+知识点总结总
- __int128
- 斯坦福大学公开课机器学习: neural networks learning - autonomous driving example(通过神经网络实现自动驾驶实例)
- easyUI,重新渲染
- 原生JS实现$.ajax