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 ...
随机推荐
- UWP学习目录整理
UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...
- 使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- php报错 ----> Call to undefined function imagecreatetruecolor()
刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...
- SDWebImage源码解读之SDWebImageCache(下)
第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...
- C++整数转字符串的一种方法
#include <sstream> //ostringstream, ostringstream::str() ostringstream stream; stream << ...
- SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
可以执行 SSIS Package ,证明用 SSIS Package 的账户是可以执行成功的.SQL Server Agent 默认指定账号是 Network Service. 那么可以尝试一下将 ...
- Linux根文件系统分析之init和busybox
Hi,大家好!我是CrazyCatJack.今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译. 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话.它的软件组成大 ...
- 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南
欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...
- Vue.js——60分钟webpack项目模板快速入门
概述 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开发模板.webpack提供了和browserify ...