linux 在C语言中使用Fork执行txt.file中的命令

jgwigjjp  于 2022-11-22  发布在  Linux
关注(0)|答案(2)|浏览(120)

我想创建一个执行txt文件中命令的c程序。我读取txt文件中的每个值并将它们放入数组中,然后我想使用fork函数逐个运行它们。谢谢您的帮助
我希望有一个慈善的帮助告诉我问题在哪里。我附上我的代码和我的数据文件的一部分。

void Execfile(char*filename)
{
    char**T;
    int nb;
    FILE*f;
    char buff[MAX_ARG];
    f=fopen("data1.txt","rb");
     while(fgets(buff,MAX_ARG,f)!=NULL){
        T=File2TabArgv(filename,&nb);
    }
    fclose(f);
    execvp(T[0],T);
    printf("\n");
    printf("END");
}

in txt.file``` 
sleep20
8aqjt8rx

8aqjt8rx1#

问题是execvp * 取代了当前进程 *(请参阅链接的man页面)。至少,您希望在调用execvp之前将fork转换为新进程,并且在父进程中,您希望将wait转换为新派生的子进程。您可能希望执行其他操作,例如关闭子进程从父进程继承的文件句柄。和/或其他信息。
如果没有forking,文本文件中的第一个“命令”将替换您自己的执行。如果没有等待,您将不知道发生了什么。这是从POSIX C运行可执行文件的基本流程。
下面是执行fork/exec的一个相当标准的习惯用法,因为它有助于查看实际代码:

int do_fork_exec(void) {
    /* Just something to exec... */
    static char const exec_cmd[] = "ls";
    static char const *exec_args[] = { [0] = "-l", [1] = NULL, };

    pid_t const fork_result = fork();

    switch (fork_result) {
    case -1: {
        int const fork_errno = errno; /* Save it before it changes. */
        fprintf(stderr, "Could not fork a new process: %s\n",
                strerror(fork_errno));
        return fork_errno;
    }
    case 0: {
        printf("Child process executing: %s...\n", exec_cmd);
        int const exec_result = execvp(exec_cmd, (char **)exec_args);

        assert(exec_result == -1); /* Exec only returns on ERRORS. */
        int const exec_errno = errno;
        fprintf(stderr, "Could not excecute the process: %s\n",
                strerror(exec_errno));
        return exec_errno;
    }
    default: {
        printf("Forking process waiting for PID %d\n", fork_result);
        int child_result = -1;
        pid_t const wait_result = wait(&child_result);
        if (wait_result == -1) {
            int const fork_errno = errno; /* Save it before it changes. */
            fprintf(stderr, "Could not wait for PID %d: %s\n",
                    fork_result, strerror(fork_errno));
            return fork_errno;
        }
        /* Wait waits on the entire process group, and we only forked one
         * process, so I am asserting that what we forked is what we waited
         * for... */
        assert(fork_result == wait_result);
        printf("Child process with PID %d exited with a status of %d\n",
               fork_result, child_result);
        break;
    }
    }

    return 0; /* Return 0 on success. */
}
cgh8pdjw

cgh8pdjw2#

你应该这样做一个叉子

int status;
my_pid = fork();
if (my_pid >= 0) {
   if (my_pid == 0) { /*child*/
      execvp(...);
      printf("failed\n");
      exit(1);
   } else { /*parent*/
      wait(&status);
      printf("child exit code: %d\n", WEXITSTATUS(status));
   }
} else {
   perror("fork failed");
   exit(1);
}

相关问题