system(), exec函数族, fork函数用法说明

启动一个新线程的方式:

  • system()

    该函数经常用来在C程序中调用shell脚本或者命令行程序.

    特点:

    效率低下,首先需要创建一个shell, 然后配置shell环境,之后再执行相应的命令。

    对shell环境的依赖很大。

  • exec() 函数族

    也用来创建新的进程,但会替换原先的进程

    int execl(const char *path, const char *arg0, …, (char *)0);

    int execp(const char *file, const char *arg0, …, (char *)0);

    int execle(const char *path, const char *arg0, …, (char *)0, char *const envp[]);

    int execv(const char *path, const char *argv[]);

    int execvp(const char *file, const char *argv[]);

    int execve(const char *path, const cha *argv[], char *const envp[])

  • fork()

    复制原先的进程环境,从而创建一个新的子进程0

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include "../main/basic_utilits.h" void system_demo()
{
printf("Run a script file in C envirenment\n");
system("../shell/mkPasswd.sh 10");
system("ps aux | awk '{print $11}' | sort | uniq -c | sort -nr | awk '{print $2}' | head");
printf("shell script over\n");
} void exec_funcs()
{
char *const ps_argv[] =
{"ps", "ax", 0}; char *const ps_envp[] =
{"PATH=/bin:/usr/bin:/usr/local/bin:/sbin", "TERM=console", 0}; execl("/bin/ps", "ps", "-ax", NULL);
execlp("ps", "ps", "ax", NULL);
execle("/bin/ps", "ps", "ax", NULL, ps_envp); execv("/bin/ps", ps_argv);
execvp("ps", ps_argv);
execve("/bin/ps", ps_argv, ps_envp);
} void fork_demo()
{
pid_t pid;
int exit_code = 0;
char *message = NULL;
int count = 0;
int i = 0;
pid = fork();
switch(pid){
case -1:
printf("fork_demo: fork error\n");
break;
case 0:
exit_code = 37;
count = 10;
message = "This is child process\n";
break;
default:
exit_code = 0;
count = 5;
message = "This is parent process\n";
break; }
for(i=0;i<count;i++){
printf("%s", message);
my_msleep(500);
} if(pid){
int stat_child = 0;
pid_t child_pid;
//child_pid = wait(&stat_child); //获取的退出码需要使用特定的宏函数进行操作
waitpid(pid, &stat_child, 0);
printf("child pid : %d stat_code: %d\n", pid, WEXITSTATUS(stat_child));
}
printf("exit code : %d\n", exit_code);
exit(exit_code);
}

system、 exec函数族、fork函数用法说明的更多相关文章

  1. Linux 环境下 fork 函数和 exec 函数族的使用

    前言 接触 Linux 已经有几个月了,以前在网上看各路大神均表示 Windows 是最烂的开发平台,我总是不以为然,但是经过这段时间琢磨,确实觉得 Linux 开发给我带来不少的便利.下面总结一下学 ...

  2. system()、exec()、fork()三个与进程有关的函数的比较

    启动新进程(system函数) system()函数可以启动一个新的进程. int system (const char *string ) 这个函数的效果就相当于执行sh –c string. 一般 ...

  3. [转帖]system()、exec()、fork()三个与进程有关的函数的比较

    system().exec().fork()三个与进程有关的函数的比较 https://www.cnblogs.com/qingergege/p/6601807.html 启动新进程(system函数 ...

  4. exec函数族,守护进程,线程同步和互斥

    2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...

  5. exec函数族的作用与讲解

    apue看到第八章,对exec函数族的理解一直都很混乱,总觉得不对劲儿,其实不能理解的先暂时跳过,看到后面,再结合实例也就慢慢的理解了. 以下内容转自:http://www.cppblog.com/p ...

  6. linux exec函数族

    1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h>   extern char **environ; ...

  7. Linux进程控制——exec函数族

    原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...

  8. fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结

    一:fork()和vfork()的区别:    fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子 ...

  9. Linux进程理解与实践(三)进程终止函数和exec函数族的使用

    进程的几种终止方式(Termination) (1)正常退出 从main函数返回[return] 调用exit 调用_exit或者_Exit 最后一个线程从其启动处返回 从最后一个线程调用pthrea ...

随机推荐

  1. YOLO-v4 口罩识别

    YOLO-v4 口罩识别 一.YOLO-v4概念 如果想要了解和认识yolo-v4的基本概念,首先要提的就是它的基础版本yolo-v1,对于yolo来说,最经典的算是yolo-v3.如果想要了解它的由 ...

  2. 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...

  3. C++ //纯虚函数和抽象类 // 语法 virtual 返回值类型 函数名 (参数列表)=0 //当类中有了纯虚函数 这个类也称为抽象类

    1 //纯虚函数和抽象类 2 // 语法 virtual 返回值类型 函数名 (参数列表)=0 3 //当类中有了纯虚函数 这个类也称为抽象类 4 5 6 #include <iostream& ...

  4. 面试常见SQL中where和having的区别你确定你知道吗!

    "Where" 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数. "Having" 是 ...

  5. JAVA基础语法:java编程规范和常用数据类型(转载)

    JAVA基础语法:java编程规范和常用数据类型 摘要 本文主要介绍了最基本的java程序规则,和常用数据类型,其中侧重说了数组的一些操作. 面向java编程 java是纯面向对象语言,所有的程序都要 ...

  6. rollup 开发环境搭建

    rollup 开发环境搭建 初始化项目使用lerna管理项目 使用npm init 初始化项目 npm init -y 安装lerna并初始化项目 npm install lerna --save-d ...

  7. Python语言系列-03-文件操作和函数

    ## 深浅拷贝 #!/usr/bin/env python3 # author:Alnk(李成果) # 赋值运算 # 可变的数据类型:由于数据类型可变,修改数据会在原来的数据的基础上进行修改, # 可 ...

  8. SpringBoot开发二十二-统一处理异常

    需求介绍 首先服务端分为三层:表现层,业务层,数据层. 请求过来先到表现层,表现层调用业务层,然后业务层调用数据层. 那么数据层出现异常它会抛出异常,那异常肯定是抛给调用者也就是业务层,那么业务层会再 ...

  9. 【死磕 Java 基础】 — 自己动手实现一个 LRU

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的男人 个人网站:https://www.cmsblogs.com/.专注于 Java 优质系列文章分享,提供一站式 Java 学习资料 LRU ...

  10. 数字化转型:敏捷和DevOps如何降低风险,提高速度

    进行数字化转型就意味着团队需要应对经常发生冲突的挑战--例如,要应对在复杂的相互依赖环境中快速变化的需求.对软件开发人员来说,这是一个熟悉的困境. 如果使用传统的瀑布方法来应对这些挑战,就会发现,在线 ...