Linux 22 C语言代码中执行Linux shell指令

本文介绍了C语言中调用Linux shell命令的三种方法:system()、popen()和exec函数簇。system()会创建子进程执行命令;popen()提供读写管道与子进程通信;exec函数族则用于替换当前进程执行新的程序。每个函数的工作原理、使用示例和注意事项都有详细说明。
摘要由CSDN通过智能技术生成

C程序调用shell脚本共同拥有三种法子 :system()、popen()、exec系列数call_exec1.c。
system() 不用你自己去产生进程。它已经封装了,直接增加自己的命令。
exec 须要你自己 fork 进程,然后exec 自己的命令。
popen() 也能够实现运行你的命令,比system 开销小。

system的使用
int system(const char *cmdstring);

cmdstring是一个字符指针,就是一个包含需要运行的shell命令的字符串

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 来确认履行成功 。

system命令以其简略 高效的作用得到很很广泛的利用。
system函数的一种实现方式:

int system(const char *cmdstring)
{
	pid_t pid;
	int status;
	if (cmdstring == NULL)
	{
		return (1);
	}
	if ((pid = fork()) < 0)
	{
		status = -1;
	}
	else if (pid == 0)
	{
		/* 本质上还是execl函数 */
		execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
		_exit(127);
	}
	else
	{
		while (waitpid(pid, &status, 0) < 0)
		{
			if (errno != EINTR)
			{
				status = -1;
				break;
			}
		}
	}
	return(status);
 } 
popen的使用

常见操作是创建一个连接到另一个进程(shell的命令行)的管道,然后读其输出或向其输入端发送数据。

popen() 会调用fork()产生子历程,然后从子历程中调用/bin/sh -c来履行 參数command的指令。參数type可使用 “r”代表读取。“w”代表写入。遵循此type值,popen()会建立管道连到子历程的标准输出设备或标准输入设备,然后返回一个文件指针。

随后历程便可利用此文件指针来读取子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值