在c程序中使用exec

时间:2015-04-17 14:10:48

标签: c linux command exec

我正在使用linux,我想在c中编写一个程序,从用户读取命令,直到我进入stop。对于每个命令,主程序将创建一个进程A,它将创建另一个进程B.进程B将执行用户输入的命令。我希望使用exec使其工作,但它只适用于一个单词命令(例如:pwdls),如果我输入例如ls -l它表示没有这样的文件或目录。到目前为止我写的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define N 100

int main() {
    char input[N];
    scanf(" %[^\n]s",input); //reads from user inputs that can include space 
    while (strcmp(input,"stop") != 0) { // verifies if entered command == stop
        int a;
        a = fork();//creates the process A
        if (a == -1) {
            perror("fork imposibil!");
            exit(1);
        }
        if (a == 0) {
            printf("a\n");//i printed that to verify if my fork works
            int b;

            b = fork();//creates process B
            if (b == -1) {
                perror("fork imposibil!");
                exit(1);
            }
            if (b == 0) { // the part that makes me problems , i try to use exec to execute the command that is stored in input
                printf("b\n");
                if (execlp(input,"",(char*) 0) < 0) {
                    perror("Error exec");
                    exit(0);
                }
                exit(0);
            }
            wait(0);
            exit(0);
        }
        wait(0);

        scanf(" %[^\n]s",input);
    }
    return 0;
}
是的,有人能帮帮我吗? 附:我不认为我的代码是如此难以阅读,但我希望它现在更好

2 个答案:

答案 0 :(得分:2)

从您的示例ls -l中,-l应该传递给参数。

int execlp(const char *file, const char *arg, ...);

来自help的引文说

  

该功能可以被认为是arg0,arg1,...,argn。他们在一起   描述一个或多个指向以null结尾的字符串的指针的列表   表示执行程序可用的参数列表。   按照惯例,第一个参数应指向文件名   与正在执行的文件相关联。参数列表必须是   由NULL指针终止,因为这些是可变参数函数,   必须将此指针强制转换为(char *)NULL。

答案 1 :(得分:0)

您没有按照预期的方式将参数传递给函数execlp()。

  

这些函数的初始参数是文件的名称   被执行。

     

execl(),execlp()中的const char * arg和后续省略号,   和execle()函数可以被认为是arg0,arg1,...,argn。   他们一起描述了一个或多个指针的列表   以null结尾的字符串,表示可用的参数列表   执行的程序。按惯例,第一个论点应该指出   到与正在执行的文件关联的文件名。清单   参数必须由NULL指针终止,因为它们是   可变参数函数,必须将此指针强制转换为(char *)NULL。

看一下如何使用execlp()函数的这个解释 - I do not understand how execlp() works in Linux

我猜你必须使用带分隔符" "的字符串拆分器函数来获取-lls -l之类的命令行参数。

strtok()在C。

中提供此功能
#include <string.h>
#include <stdio.h>

int main(void)
{
    char input[] = "A bird came down the walk";
    printf("Parsing the input string '%s'\n", input);
    char *token = strtok(input, " ");
    while(token) {
        puts(token);
        token = strtok(NULL, " ");
    }

    printf("Contents of the input string now: '");
    for(size_t n = 0; n < sizeof input; ++n)
        input[n] ? printf("%c", input[n]) : printf("\\0");
    puts("'");
}