1、system(执行shell 命令)
相关函数:fork,execve,waitpid,popen
表头文件:#include<stdlib.h>
定义函数:int system(const char * string);
函数说明:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
如果system()在调用/bin/sh时失败则返回127,
其他失败原因返回-1。若参数string为空指针(NULL),
则返回非零值。
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查
errno 来确认执行成功。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
附加说明:在编写具有SUID/SGID权限的程序时请勿使用system(),system()会
继承环境变量,通过环境变量可能会造成系统安全的问题。
范例:
#include<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
2、popen(建立管道I/O)
相关函数:pipe,mkfifo,pclose,fork,system,fopen
表头文件:#include<stdio.h>
定义函数:FILE * popen( const char * command,const char * type);
函数说明:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
错误代码 EINVAL参数type不合法。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
注意事项:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()
会继承环境变量,通过环境变量可能会造成系统安全的问题。
范例:
#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}
执行 root :x:0 0: root: /root: /bin/bash
3、使用vfork()新建子进程,然后调用exec函数族
#include<unistd.h>
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
if(vfork() = =0)
{
execv(“/bin/ls”,argv);
}else{
printf(“This is the parent process\n”);
}
}
相关推荐
在C语言中调用shell命令是一项常见的需求,特别是在与操作系统进行交互时。本文将详细解析两种主要的方法:`system()`函数和`popen()`函数,以及一个更底层的方法——使用`vfork()`和`exec`函数族。 1. **`system()...
1. **命令解析**:在C语言实现的shell中,首先要实现的是命令解析。这涉及到字符串处理,如使用`strtok()`函数分割用户输入的命令行,识别命令、参数和路径等。 2. **命令执行**:shell需要能够调用系统的`execve()...
在本文中,我们将深入探讨shell命令解析器的工作原理,以及如何使用C语言编程来模拟一个简单的shell命令解析器。 首先,我们需要理解shell的基本功能。shell提供了一个交互式的环境,用户可以输入命令,如`ls`、`cd...
在Linux操作系统中,Shell是一种命令行解释器,它允许用户通过文本输入来执行系统命令。C语言实现Linux Shell的功能是一项有趣的编程挑战,可以深入理解操作系统的工作原理。本项目旨在用C语言实现一些基本的Shell...
- **开发环境与目标**:本项目旨在通过使用C语言,在Linux/Unix平台上开发一个命令解释器程序。该程序的目标是模仿现有的shell命令行界面的功能,从而为用户提供一套基本但实用的命令执行环境。 - **核心功能**: -...
`shell编程.pdf`中或许也包含了一些关于如何在C程序中调用Shell命令的示例。 `vim_中文参考手册.pdf`是关于Vim编辑器的文档,这是一款强大的文本编辑器,常用于编写Shell脚本和C程序。它提供了丰富的快捷键和功能,...
一,实验简介《 C语言实现Linux Shell命令解释器》项目可以学习Linux系统编程能力,尤其是在多进程方面。可以了解到fork,execvp等重要的系统调用。另外可以深入理解Linux Shell的功能的实现手段。 。为了测试方便,...
当你在Shell中启动一个程序并按下`&`时,程序会在后台运行,而你能够继续输入其他命令。`jobs`命令用于列出当前所有的后台任务,`fg`(foreground)命令则用来将后台任务带到前台继续执行。 2. **FG(Foreground)*...
1.1. 课程设计内容 ...即用户可以使用“&”作为一个命令,表示该命令在后台启动。前台还可以处理其他命令。 (3)修改程序,增加I/O重定向功能。即用户可以使用“>”,“<”和“|”符号改变程或文件的输入和输出。
在Linux操作系统中,C语言是一种常用的底层编程语言,可以用来创建强大的系统级工具,包括模拟shell环境的程序。shell是用户与操作系统内核交互的接口,它接收用户的命令并执行相应的系统调用。本项目中,开发者使用...
1. **进程控制**:在shell中,用户可以启动新的进程来执行命令。在C语言中,这通常通过调用`fork()`函数来实现,创建子进程。然后,使用`exec()`系列函数(如`execl()`, `execlp()`, `execv()`, `execvp()`等)加载...
在C语言中实现这些命令需要对网络协议和设备驱动有深入理解,并可能涉及到与硬件交互的低级操作。 4. **与Linux系统交互**: 要在C程序中执行Linux命令,可以使用`system()`函数,它会启动一个新的shell进程来执行...
"在LINUX C中以多进程方式实现微型SHELL" 本文主要讨论了在Linux C中使用多进程方式实现微型SHELL的设计与实现。Linux C为用户提供了一个强大的编程环境,本文分析了微型SHELL的基本功能及实现机制,并使用Linux下...
- **循环读取命令**:在Shell中,需要不断地读取用户输入并执行,直到用户选择退出。 通过分析和调试这个程序,你不仅可以掌握Unix Shell的基本工作原理,还能深化对C语言系统编程的理解,提升解决问题的能力。对于...
1、应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符; 接受和分析命令行(滤去无效的空格、tab符号以及换行符等);执行命令(要有出错处理;输入exit...
在C语言中调用Linux脚本通常通过`system()`函数或者`popen()`函数实现,这两个函数都是标准C库提供的,可以直接调用shell命令执行脚本。 1. 使用`system()`函数 ```c #include int main() { int result; ...
Linux编程时候,如果我们需要调用shell命令或脚本通常使用system方法。如system(“ls”) 该方法返回值为0或-1,即成功或失败。而有的时候我们想要获取shell命令执行的结果,该怎么办呢? 我们可以将shell...
在C语言中,这可能通过函数指针实现,或者通过`system()`函数来执行shell命令。 5. **错误处理**:如果用户输入的命令无效或格式错误,解析器需要提供反馈。这可能包括打印错误信息或者返回错误码。 在"黄雪虹...