文档章节

进程与系统调用

memristor
 memristor
发布于 2014/06/01 13:09
字数 668
阅读 30
收藏 0

system

system("") 接收一个命令参数并执行命令,操作系统在解释命令参数时容易出错,而且通过拼接字符串可能造成系统入侵,不安全


exec()函数

通过运行其他程序来替换当前进程,新老进程具有相同的pid,声明在unistd.h中

exec是最基本的函数,还有一些扩展函数,每个exec函数后可能跟1,2个字符,只可能是l, v, p, e, 

l: 参数列表

v:参数数组或向量

p: 根据path查找

e: 环境变量

每个字母代表了相应的功能,l , v总是在 p, e之前

#include <unistd.h>
int execl(const char *pathname, const char *arg0, ..., /* (char *)0 */);
int execlp(const char *filename, const char *arg, ..., /* (char *)0 */);
int execle(const char *pathname, const char *arg0, ..., /* (char *)0, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *filename, char *const argv[]);
int execve(const char *pathname, char *const argv[], char *const envp[]);

在 linux ,要成功执行 uname ­r 这个命令,exec 家族各个函数的例子为

execv

char *arg[] = {"uname", "­r", NULL}; 
execv("/bin/uname", arg);

execl

execl("/bin/uname", "uname", "­r", NULL);

execve

char *arg[] = {"uname", "­r", NULL}; 
char *env[] = {NULL}; 
execve("/bin/uname", arg, env);

execvp

char *arg[] = {"uname", "­r", NULL}; 
execvp("uname", arg);

execle

char *env[] = {NULL}; 
execle(“/bin/uname", "uname", "­r", NULL, env);

exelp

execlp("uname", "uname", "­r", NULL);


调用系统进程

#include <stdio.h>
#include <unistd.h>//You need this for the exec() functions
#include <errno.h> //You need this for the errno variable.
#include <string.h>//This will let you display errors with strerror().

int main()
{
	if (execl("/sbin/ifconfig","/sbin/ifconfig",NULL)==-1)//Use execl() because you have the path to the program file,If execl() returns -1, it failed, so we should probably look for ipconfig
		if (execlp("ipconfig","ipconfig",NULL)== -1) { //execlp() will let us find the ipconfig command on the path
			fprintf(stderr, "Cannot run ipconfig: %s",strerror(errno));//The strerror() function will display any problems
			return 1;
		}
	return 0;
}

调用自定义进程

dinner_info.c ,路径为/home/weiwei/Desktop/c/system/dinner_info.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	printf("Diners: %s\n", argv[1]);
	printf("Juice: %s\n", getenv("JUICE"));
	return 0;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{

	printf(" the Father process! ");
	char *my_env[] = {"JUICE=peach and apple", NULL};//Each variable in the environment is name=value,The last item in the array must be NULL.
if(execle("/home/weiwei/Desktop/c/system/dinner_info", "/home/weiwei/Desktop/c/system/dinner_info", "4", NULL, my_env)==-1){//execle passes a list of arguments andan environment
	printf(" the process is wrong!! ");
	fprintf(stderr, "Cannot run : %s",strerror(errno));
}


	return 0;
}

克隆进程

一旦调用exec函数,原来的程序马上就被终止掉,所以上图中的for循环只会运行第一个,如果在启动另一个进程的时候同时让原进程继续运行,使用fork()克隆当前进程,新建副本将从同一行开始运行相同的程序,只有pid与原进程不同,原进程是父进程,新建副本为子进程


© 著作权归作者所有

共有 人打赏支持
memristor
粉丝 45
博文 203
码字总数 176319
作品 0
长沙
程序员
私信 提问
Linux下嵌入汇编代码调用API(using fork())

以下关于fork()的描述来自于:jason314 首先,在Linux环境下,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进...

不高不富不帅的陈政_
2016/03/17
116
0
现代操作系统笔记——第一章 引论

第一章 引论 1.3.2 存储器 分层结构:寄存器、高速缓存、内存、磁盘、磁带 寄存器:典型存储容量:32位CPU中为3232位,而在64位CPU中位6464位。 内存(主存):RAM 只读存储器(ROM)在工厂中...

u010982765
2018/04/09
0
0
Linux 信号signal处理机制

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种...

长平狐
2013/01/06
43
0
使用 Ptrace 去拦截和仿真 Linux 系统调用

(“进程跟踪process trace”)系统调用通常都与调试有关。它是类 Unix 系统上通过原生调试器监测被调试进程的主要机制。它也是实现 strace(系统调用跟踪system call trace)的常见方法。使...

10%
2018/08/22
0
0
如何利用Ptrace拦截和模拟Linux系统调用

  写在前面的话   ptrace(2)这个系统调用一般都跟调试离不开关系,它不仅是类Unix系统中本地调试器监控实现的主要机制,而且它还是strace系统调用常用的实现方法。ptrace()系统调用函数提...

FreeBuf
2018/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Navicat怎样导入Excel表格和txt文本的数据

Navicat怎样导入Excel表格和txt文本的数据 2018年07月02日 11:29:11 零碎de記憶 阅读数:2433 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39135287/ar...

linjin200
10分钟前
0
0
使用MaxCompute Java SDK运行安全相关命令

使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令。官方文档上有详细的MaxCompute 安全指南 ,并给出了安全相关语句汇总 。 简而言之, 权限管理 、 列级别访问控制 、 ...

阿里云云栖社区
15分钟前
0
0
中小公司的Java工程师应该如何逆袭冲进BAT?

(1)80% Java工程师都有的迷茫 这篇文章,跟大家聊一聊很多很多很多人问我的一个问题:中小公司的Java工程师应该如何规划准备,才能跳槽进入BAT这类一线互联网公司? 之所以我用了三个 “很...

Java填坑路
15分钟前
1
0
你的应用够安全吗?绿标2.0隐私权限详解

近日,最新一期的《绿色应用达标率调查报告》结果显示,应用在安全方面的通过率仅为57%,相较于其他四项标准通过率最低。其中隐私权限的过度获取是主要原因之一,需要开发者尽快完成整改。 ...

安卓绿色联盟
25分钟前
0
0
使用MaxCompute Java SDK运行安全相关命令

使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令。官方文档上有详细的MaxCompute安全指南,并给出了安全相关语句汇总。 简而言之,权限管理、列级别访问控制、项目空间...

阿里云官方博客
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部