linux下调用shell命令

本文详细介绍了Linux中用于执行shell命令的system函数、建立管道I/O交互的popen函数,以及使用vfork与exec函数族进行更细粒度的进程控制。通过具体实例,展示了如何利用这些函数实现命令执行、文件读写及多进程间的高效通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 来确认执行成功。
附加说明 在编写具有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()以外。
返回值 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
错误代码 EINVAL参数type不合法。
注意事项 在编写具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”);
}
}
复制代码
<think>嗯,用户问的是每次Linuxshell启动时都会调用哪些命令。这个问题看起来需要我详细解释一下shell启动时涉及的配置文件和环境设置。不过我得先确认自己对这些配置文件的了解是否正确,比如不同shell之间的区别,比如Bash和Zsh可能有所不同,但用户没有指定具体是哪个shell,所以应该以最常见的Bash为例来回答。 首先,我需要回忆一下Bash的启动文件。当用户登录时,Bash会执行哪些文件呢?比如/etc/profile,然后是用户主目录下的.bash_profile、.bash_login或者.profile。如果是非登录的交互式shell,比如打开一个终端窗口,可能会读取.bashrc。而如果是非交互式shell,比如执行脚本,可能不会读取这些文件。 用户的问题提到“每次shell都会调用”,所以需要分情况讨论,是登录shell还是非登录shell,交互式还是非交互式。可能用户没有意识到不同情况下调用的文件不同,所以需要明确区分。 另外,可能用户对shell启动过程不太熟悉,所以需要举例子说明不同情况下的调用顺序。比如登录时执行的全局配置/etc/profile,然后是用户自己的配置文件。而如果是子shell或者新终端,可能只会读取.bashrc。 需要注意的是,不同的发行版可能有不同的默认配置,比如有些系统会在/etc/profile中source /etc/bash.bashrc,或者用户自己的.bash_profile中会显式调用.bashrc。这些细节需要解释清楚,避免误导用户。 可能用户真正想知道的是为什么某些环境变量或别名在每次打开终端时自动生效,这时候应该解释.bashrc的作用。或者用户可能遇到配置不生效的问题,需要检查是否正确配置了相关文件。 另外,是否有其他文件会被调用,比如/etc/bash.bash_logout在退出时执行,但用户问的是每次启动时的调用,所以可能不需要涉及logout文件。 总结一下,回答的结构应该是先说明shell的不同类型(登录、非登录,交互式、非交互式),然后分别介绍每种情况下会读取哪些配置文件,最后给出常见的调用顺序和示例。这样用户可以根据自己的使用场景理解哪些命令会被执行。</think>在 Linux 系统中,每次启动 Shell调用命令取决于 **Shell 的类型**(登录/非登录、交互式/非交互式)和 **具体 Shell 的实现**(如 Bash/Zsh)。以下以最常见的 **Bash Shell** 为例,分情况说明: --- ### 一、Shell 类型分类 1. **登录 Shell** - 场景:通过 SSH 登录、`su - username` 切换用户、虚拟终端登录 - 行为:会执行 **登录初始化文件** 2. **非登录 Shell** - 场景:直接打开终端窗口、`su username` 切换用户 - 行为:仅执行 **非登录初始化文件** 3. **交互式 Shell** - 场景:用户手动输入命令,终端有交互提示符 - 行为:会加载用户自定义的别名、函数等 4. **非交互式 Shell** - 场景:执行脚本(如 `bash script.sh`) - 行为:不加载用户配置文件 --- ### 二、Bash Shell 启动时调用的文件 #### 1. 登录 Shell 调用顺序: ```bash /etc/profile → ~/.bash_profile → ~/.bash_login → ~/.profile ``` - **`/etc/profile`** 全局配置文件,所有用户共享。通常会调用 `/etc/bash.bashrc` - **`~/.bash_profile`** 用户个人配置(优先级高于 `.bash_login` 和 `.profile`) 常见操作:加载 `~/.bashrc`,设置环境变量(如 `PATH`) #### 2. 非登录 Shell 调用顺序: ```bash /etc/bash.bashrc → ~/.bashrc ``` - **`~/.bashrc`** 用户自定义别名、函数、Shell 选项(如 `PS1` 提示符) 注意:某些发行版(如 Ubuntu)默认在 `~/.profile` 中显式加载 `~/.bashrc` #### 3. 退出 Shell 时: ```bash ~/.bash_logout ``` - 用于执行清理任务(如清空历史记录) --- ### 三、示例场景 #### 场景 1:SSH 登录服务器(登录 Shell) ```bash # 调用顺序: 1. /etc/profile 2. ~/.bash_profile(如果存在) → 如果不存在,依次查找 ~/.bash_login 和 ~/.profile 3. ~/.bashrc(如果被显式调用) ``` #### 场景 2:打开终端窗口(非登录 Shell) ```bash # 调用顺序: 1. /etc/bash.bashrc 2. ~/.bashrc ``` #### 场景 3:执行脚本(非交互式 Shell) ```bash bash script.sh # 不加载任何配置文件 ``` --- ### 四、验证方法 1. **查看当前 Shell 类型**: ```bash echo $0 # 显示 "-bash" 为登录 Shell,否则为普通 Shell shopt login_shell # 输出 "login_shell on" 表示登录 Shell ``` 2. **追踪配置加载**: ```bash bash -x -l # 模拟登录 Shell 并显示执行过程 ``` --- ### 五、核心总结 | Shell 类型 | 调用的配置文件 | |------------------|---------------------------------------| | **登录 Shell** | `/etc/profile` → `~/.bash_profile` | | **非登录 Shell** | `/etc/bash.bashrc` → `~/.bashrc` | | **脚本执行** | 不加载配置文件(除非显式 `source`) | 建议将个人配置统一写在 `~/.bashrc` 中,并通过 `~/.profile` 或 `~/.bash_profile` 加载,以确保兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值