C - 执行命令的函数

时间:2015-09-02 22:13:27

标签: c ubuntu operating-system

如何创建一个将另一个命令作为参数并执行该命令的函数。比如说我想做

lightCopy()

并让它在文件/ etc / motd上执行 cat 命令,以便打印当天的消息。如果有人能告诉我,我将非常感激!

编辑:我不能使用system()调用,因为我必须编写一个基本的命令shell。我只需要知道如何执行命令,这样当用户输入cat foo.txt时,它会执行命令并显示文件。我想我想说的是,你如何使用execve()?里面有什么争论?

2 个答案:

答案 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环境变量。