使用 execvp、fork 和等待执行文件中的代码

Using execvp,fork and wait to execute codes in file

我一直在使用 execvp 来执行写在文本文件中的 unix 命令。下面是我写的代码,但它似乎不起作用。
我正在从文件中读取行,每一行都包含一个 unix 命令(mv、cp 等)。

#include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include <unistd.h>
    int main ( int argc, char *argv[] )
    {   pid_t  pid;
        pid_t child_pid;
        int child_status;  
        char *token;    
        FILE *fp;
        fp = fopen(argv[1],"r");
        int i,j,ctr,rc_wait;
        if( fp == NULL){
            perror("An error has occurred\n");
            exit(1);
            }
        char buff[100];
        while(fgets(buff, sizeof(buff), fp)){    
            child_pid=fork();
            if(child_pid<0){
                printf("\nfork failed, error");
                exit(0);
            }
            else if(child_pid==0){
            //printf("\nString value = %s", buff);
            token = strtok(buff, " \t");
            execvp(token,buff);
            }
            else{
            rc_wait = wait(NULL);
            continue;
            }

            }   

            }
            return 0;
            }

输入文件已作为参数提供给程序,输入包含以下示例:

    cp temp1/f1.txt              temp2/
    mv temp1/f2.c                           temp2/
    cp temp1/f3.txt                temp2/
    cp temp1/f4.txt                temp2/
    cp temp1/f5.txt                temp2/
    cp temp1/f6.txt                 temp2/
    mv temp1/f7.c                   temp1/f8.c
    mv temp1/f9.c                   temp2/
    cp temp1/f1.txt              temp1/f1a.txt

您误用了 strtokexecvp。前者在你调用它时改变输入字符串,所以在它有一次 运行 之后,它被 buff 分成 NULtokenbuff 实际上在第一次调用后引用相同的地址,尽管 token 会在额外的标记化之后改变)。如果您在生成每个结果时复制每个结果,则只能使用 strtok 来完全解析输入(例如,如果您可以依赖现代 POSIX 标准,则通过 strdup),因为只有最最近返回的指针永远有效。

你的execvp用法也是错误的; execvp 的第二个参数是 C 风格字符串数组,char*s(数组本身以 NULL 指针终止)。您向它传递了一个 char 的普通数组(一个字符串,而不是它们的数组)。

请阅读两个 API 的 man 页面;你离题太远了,很明显你只是在猜测它们是如何工作的。