这一篇博客讲解进程和系统调用相关的知识

有这样一个场景,我需要输入一串文字,然后把我输入的文字加上一个本地的时间戳 保存在一个文件中,可以初步理解为一个备忘录也行

 #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 进程和系统调用的更多相关文章

  1. (转)Linux内核之进程和系统调用

    Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...

  2. linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令

    本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空 ...

  3. [strace]跟踪进程的系统调用

    转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...

  4. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

    strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...

  5. Linux进程管理及while循环

    目录 进程的相关概念 进程查看及管理工具的使用 Linux系统作业控制 调整进程优先级 网络客户端工具 bash之while循环 20.1.进程类型 守护进程 daemon,在系统引导过程中启动的进程 ...

  6. c 进程间的通信

    在上篇讲解了如何创建和调用进程 c 进程和系统调用 这篇文章就专门讲讲进程通信的问题 先来看一段下边的代码,这段代码的作用是根据关键字调用一个Python程序来检索RSS源,然后打开那个URL #in ...

  7. Linux进程学习

    进程与进程管理: 清屏:system("clear"); //#include <signal.h> 进程环境与进程属性: 什么是进程:简单的说,进程就是程序的一次执行 ...

  8. strace追踪未开始或者来不及捕获pid的进程(译)

    我的个人博客网站最近被攻击了,被用来发送一些垃圾邮件.但是我不知道这个进程是怎么来的,用top查看发现一个不知道干什么的perl脚本,决定给用strace查看一下. strace可以追踪一个进程的系统 ...

  9. Linux下取代top的进程管理工具 htop

    一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for ...

随机推荐

  1. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  2. CentOS7 重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  3. Angular企业级开发(3)-Angular MVC实现

    1.MVC介绍 Model-View-Controller 在20世纪80年代为程序语言Smalltalk发明的一种软件架构.MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并 ...

  4. 从零开始编写自己的C#框架(24)——测试

    导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...

  5. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  6. echarts+php+mysql 绘图实例

    最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...

  7. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  8. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...

  9. iOS之开发中一些相关的路径以及获取路径的方法

    模拟器的位置: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs ...

  10. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...