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. 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分

    @Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...

  2. ASP.NET MVC部署网站到IIS,只列出网站目录

    解决办法: 1.重启IIS 打开CMD运行以下代码: ps:根据发布网站的的.NET Framework版本进入对应的目录 4.0版本  C:\Windows\Microsoft.NET\Framew ...

  3. 【Android】真机调试新姿势:无线连接

    由于工作需要,需要无线连接手机调试,特意百度了一下 在进行Android开发时,一般我们都是用usb线把手机和电脑连接起来进行调试工作.但如果你觉得这样不够酷的话,可以尝试一下无线连接,颇简单,GO! ...

  4. ERROR: database "db" is being accessed by other users

    执行DROP DATABASE testdb;的时候提示: ERROR: database "testdb" is being accessed by other users DE ...

  5. Virustotal工具产品初研

    一.产品新特点 1.群体智能 2.VT图 3.VT Yara 规则的生成与优化 4.内容搜索优化(大小及提交数量) 二.产品功能 1. --->安全管理员 威胁平台资源丰富 TIP .MISP ...

  6. 基于ivy的源代码调试方法

    项目PORJ_TEST是项目PROJ的测试项目.在它的ivy中引用了PROJ的jar包.由于PROJ正处于开发阶段,源代码更改频繁, 在运行PROJ_TEST中的测试时,需要进入PROJ的jar包内部 ...

  7. SpringMVC学习08(拦截器)

    8.拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过滤器与拦截器的区别: ...

  8. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  9. DG:11.2.0.4 RAC在线duplicate恢复DG

    1.环境介绍 测试环境, 在一个双节点的RAC上使用duplicate搭建DG,使用在线的方式搭建 主机 IP 操作系统 实例 db_name db_unique_name db_version 配置 ...

  10. GitLabRunner命令

    启动命令 gitlab-runner --debug <command> #调试模式排查错误特别有用. gitlab-runner <command> --help #获取帮助 ...