c 进程和系统调用
这一篇博客讲解进程和系统调用相关的知识
有这样一个场景,我需要输入一串文字,然后把我输入的文字加上一个本地的时间戳 保存在一个文件中,可以初步理解为一个备忘录也行
#include <stdio.h>
#include <stdlib.h>
#include <time.h> /**
* 获取一个当前时间
*/
char *now() {
time_t t;
time(&t);
return asctime(localtime(&t));
} int main(int argc, const char * argv[]) { char comment[];
char cmd[]; fgets(comment, , stdin);
// sprintf 把内容写进一个变量中
sprintf(cmd, "echo '%s %s' >> reports.log",comment,now());
// 调用系统的方法来执行这段命令
system(cmd);
return ;
}
程序运行的结果是生成了一个文件

但有时候systemt() 函数也会是不安全的
sprintf(cmd, "echo ''&& ls / && echo' %s' >> reports.log",now());
修改上边的代码,然后会得到这样的结果

列出了根目录下的内容,因此可以使用命令删除文件或启动病毒






那么现在有一个场景,我们有exec来获取本机的网络配置,在Linux 和 Mac 上 你可以用一个叫/sbin/ifconfig的程序 在window上你用ipconfig
看代码
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h> int main(int argc, const char * argv[]) { if (execl("/sbin/ifconfig", "/sbin/ifconfig",NULL) == -) { if (execlp("ipconfig", "ipconfig",NULL) == -) { fprintf(stderr, "Can not run ipconfig : %s",strerror(errno));
}
}
return ;
}
下边的代码也是很有意思的,可以充分说明exec函数的作用是停止当前进程 跳到另一个进程的
我们先创建一个叫做coffee.c 的文件,代码如下
#include <stdio.h>
#include <stdlib.h> int main(int argc, char* argv[]) { char *w = getenv("EXTRA");
if (!w) {
w = getenv("FOOD");
}
if (!w) {
w = argv[argc - ];
} char *c = getenv("EXTRA");
if (!c) {
c = argv[argc - ];
} printf("%s with %s \n", c, w);
return ;
}
该程序的作用是先检测是否有环境变量EXTRA 没有就检测FOOD 如果还没有就给w赋值为最后一个参数值
先检测环境变量EXTRA 如果没有就给c赋值为最后一个参数
下边的代码可以检测我们上边这段代码是不是能够正确运行,首先我们新建一个coffeeTest.c的文件
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h> int main(int argc, char* argv[]) { char *my_env[] = {"FOOD=Hanbaobao", NULL};
if (execle("./coffee", "./coffee", "abv", NULL, my_env) == -) {
fprintf(stderr, "Can not run process: %s",strerror(errno));
return ;
}
return ;
}
gcc coffee.c -o coffee
gcc coffeeTest.c -o coffeeTest
./coffeeTest
得到的结果是
abv with Hanbaobao
假如我们吧coffeeTest.c中的代码改成这样呢
if (execl("./coffee", "./coffee", "abv", NULL) == -) {
fprintf(stderr, "Can not run process: %s",strerror(errno));
return ;
}
不出意外结果就是
abv with abv
好了,我们已经了解exec函数的使用方法了,其实exec函数算是程序中的最后一行代码了,只要调用它之后,程序立即停止运行,原理就是停止当前进程开启另外一个进程
那么如果我们还想要后边的代码继续执行呢
先看个例子
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h> int main(int argc, char* argv[]) { char *my_env[] = {"FOOD=Hanbaobao", NULL}; for (int i = ; i < ; i++) { pid_t pid = fork(); if (pid == -) {
fprintf(stderr, "Can not fork process: %s",strerror(errno));
return ;
} if (!pid) { if (execle("./coffee", "./coffee", "abv", NULL, my_env) == -) {
fprintf(stderr, "Can not run process: %s",strerror(errno));
return ;
}
} }
return ;
}
如果不加fork() 上边的程序只会打印一次结果,当循环中第一次调用exec的时候,后边的代码就不会再调用了
fork 是什么,看下边的解释





c 进程和系统调用的更多相关文章
- (转)Linux内核之进程和系统调用
Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...
- linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令
本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空 ...
- [strace]跟踪进程的系统调用
转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...
- 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...
- Linux进程管理及while循环
目录 进程的相关概念 进程查看及管理工具的使用 Linux系统作业控制 调整进程优先级 网络客户端工具 bash之while循环 20.1.进程类型 守护进程 daemon,在系统引导过程中启动的进程 ...
- c 进程间的通信
在上篇讲解了如何创建和调用进程 c 进程和系统调用 这篇文章就专门讲讲进程通信的问题 先来看一段下边的代码,这段代码的作用是根据关键字调用一个Python程序来检索RSS源,然后打开那个URL #in ...
- Linux进程学习
进程与进程管理: 清屏:system("clear"); //#include <signal.h> 进程环境与进程属性: 什么是进程:简单的说,进程就是程序的一次执行 ...
- strace追踪未开始或者来不及捕获pid的进程(译)
我的个人博客网站最近被攻击了,被用来发送一些垃圾邮件.但是我不知道这个进程是怎么来的,用top查看发现一个不知道干什么的perl脚本,决定给用strace查看一下. strace可以追踪一个进程的系统 ...
- Linux下取代top的进程管理工具 htop
一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- android 使用Tabhost 发生could not create tab content because could not find view with id 错误
使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- 你真的会玩SQL吗?之逻辑查询处理阶段
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)
在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下