execve用法举例

通过execve简单的调用,下面我们要调用 “ls”来显示我当前目录下的文件 :

/*
 * execve
 */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *args[] = {"/bin/ls", NULL};

	if(execve ("/bin/ls", args, NULL) == -1)
	{
		perror ("execve");
		exit(EXIT_FAILURE);
	}

	puts("shouldn't get here");
	
	exit (EXIT_SUCCESS);
}

execve接受3个参数:path,  argv 和 envp。 path就是要执行的二进制文件或者脚本的完整路径。argv是要传递给程序的完整参数列表,它一般是执行程序的名字。envp是指向执行execed程序的专门环境指针。

在上面的例子中,没有执行puts语句,为什么呢?     因为exec完全用新进程替换了调用进程,所以调用进程就没有了,不再有能返回的调用进程了。

Redis是一个开源的内存数据结构存储系统,它使用C语言编写。在Redis的源代码中,execve函数主要用于执行外部程序。 在Redis源代码中,execve函数被用在了AOF(Append-Only File)持久化机制的实现中。AOF持久化机制会将Redis服务器接收到的每个写命令都追加到一个AOF文件中,以便在Redis服务器重新启动时重放这些命令来恢复数据。当Redis需要将AOF文件转换为内存数据库时,它会调用execve函数来执行外部程序。 以下是Redis源代码中execve函数的一个例子: ```c static int rewriteAppendOnlyFileBackground(void) { pid_t childpid; long long start; if (server.aof_child_pid != -1) return C_ERR; /* Rewrite already in progress */ server.stat_rewriting_aof = 1; server.aof_rewrite_time_start = start = ustime(); if ((childpid = fork()) == 0) { char tmpfile[256]; /* Child */ closeListeningSockets(0); if (server.ipfd > 0) close(server.ipfd); if (server.tlsfd > 0) close(server.tlsfd); server.ipfd = server.tlsfd = -1; snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid()); openChildInfoPipe(); if (rewriteAppendOnlyFile(tmpfile) == C_OK) { if (rename(tmpfile,server.aof_filename) == -1) { serverLog(LL_WARNING,"Can't rename %s as %s: %s", tmpfile, server.aof_filename, strerror(errno)); exit(1); } exitFromChild(0); } else { exitFromChild(1); } } else { /* Parent */ if (childpid == -1) { serverLog(LL_WARNING,"Can't rewrite append only file in background: fork: %s", strerror(errno)); return C_ERR; } serverLog(LL_NOTICE,"Background append only file rewriting started by pid %d",childpid); server.aof_child_pid = childpid; updateDictResizePolicy(); return C_OK; } } ``` 在上述代码中,当Redis需要将AOF文件转换为内存数据库时,它会调用rewriteAppendOnlyFileBackground函数来启动一个子进程来执行AOF文件转换。在子进程中,它会调用rewriteAppendOnlyFile函数来执行AOF文件转换,并将结果写入一个临时文件中。如果AOF文件转换成功,它会调用rename函数将临时文件重命名为正式的AOF文件;否则,它会退出子进程。 在子进程中,openChildInfoPipe函数用于打开一个管道,用于将子进程的状态信息传递给父进程。如果子进程需要向父进程报告状态信息,它会调用sendChildInfo函数将信息发送到管道中。在父进程中,updateDictResizePolicy函数会更新字典的大小调整策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值