如何创建一个将另一个命令作为参数并执行该命令的函数。比如说我想做
lightCopy()
并让它在文件/ etc / motd上执行 cat 命令,以便打印当天的消息。如果有人能告诉我,我将非常感激!
编辑:我不能使用system()调用,因为我必须编写一个基本的命令shell。我只需要知道如何执行命令,这样当用户输入cat foo.txt时,它会执行命令并显示文件。我想我想说的是,你如何使用execve()?里面有什么争论?
答案 0 :(得分:1)
使用您可以使用system
功能。
示例:
system("cat foo.txt");
将运行此:
cat foo.txt
答案 1 :(得分:0)
你可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
size_t command_length = 0;
if(argc < 2)
return 0;
for(int i = 1; i < argc; i++)
command_length += strlen(argv[i]);
command_length += argc - 2; // spaces between words
command_length++; // terminator '\0'
char command[command_length];
memset(command, 0, sizeof(command));
for(int i = 1; i < argc; i++) {
strcat(command, argv[i]);
if(i < argc - 1)
command[strlen(command)] = ' ';
}
system(command);
}
首先确定所有命令行参数的长度。之后,它连接所有命令行参数并在每个参数之间插入一个空格。最后但并非最不重要的是,它使用此字符串调用system()
函数。
您需要使用支持VLA的C11编译器。
以下是没有system()
的版本:
#include <string.h>
#include <unistd.h>
#define MAX 1024
int main(int argc, char *argv[]) {
char buf[MAX] = "/usr/bin/";
size_t len = MAX - strlen(buf) + 1;
if(argc < 2)
return 0;
strncat(buf, argv[1], len);
execve(buf, argv + 1, NULL);
return 0;
}
此程序仅适用于Linux。不幸的是execve()
期望绝对路径。我假设可执行文件位于/ usr / bin下。如果情况并非如此,则需要额外的工作。例如,您必须检查$PATH
环境变量。