【问题标题】:create a process to execute any command创建一个进程来执行任何命令
【发布时间】:2013-11-04 04:20:35
【问题描述】:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unist.h>
#include <stdlib.h>

#define LINE_MAX 255
#define ARG_MAX  10

#define SH_PROMPT "next> "

int run_command(char *[]);
int getline(char *);
void parse_line(char *, char*[]);

int main(void)
{
    char line[LINE_MAX+1];
    char *argbuf[ARG_MAX+!];
    int temp;

    do{
        printf(SH_PROMPT); fflush(stdout);
        if ((temp = getline(line)) != -1){
            parse_line(line, argbuf);
            run_command(argbuf);
        }
    } while (temp != -1);
    return 0;
}


int run_command(char *command[]){
    pid_t child;
    pid_t c;

    if ((child = fork()) == 0){
        execvp(command[0], command);
        fprintf(stderr, "Child process could not do execvp.\n");
        exit(1);
    }
    else{
        if(child == (pid_t)(-1)){
            fprintf(stderr, "Fork failed - Use spoon. \n");
            exit(1);
        }
        else {
            c = wait(NULL);
            return 0;
        }
    }
}

我想编写一个程序来创建一个新进程,并在该子进程中执行任何命令。同时,当子进程终止时,父进程应在标准输出上打印一行,说明相关命令是否成功完成(如“命令/bin/who已成功完成”)。一旦它的所有子进程都终止了,父进程应该打印“All done, bye-bye!”在它本身终止之前。我需要关于完成和错误检查的代码帮助。请帮忙,谢谢!

【问题讨论】:

    标签: c unix operating-system fork system-calls


    【解决方案1】:

    首先,wait 函数在等待时会阻塞,所以第一部分(父在子退出时打印消息)应该非常简单。

    至于在退出前打印,就这样做。在main 中的最后一个return 0; 之前添加一个printf 调用。

    【讨论】:

    • q5.c:4:19:错误:unist.h:没有这样的文件或目录 q5.c:12:错误:“getline”/usr/include/stdio.h 的类型冲突: 449:错误:'getline' 的先前声明在这里 q5.c:在函数'main'中:q5.c:23:警告:从不兼容的指针类型传递'getline'的参数 1
    • @TomLouie &lt;unistd.h&gt;,而不是 &lt;unist.h&gt;。你实现了自己的getline 函数了吗?标准库中已经存在这样的函数,并且在&lt;stdio.h&gt; 中声明(不同)。请阅读错误信息,他们在这方面非常清楚。
    • 我还需要实现这个:编写一个程序,它接受一个命令行参数列表,每个参数都是一个命令的完整路径(例如/bin/ls、/bin/ps、 /bin/date、/usr/bin/who、/bin/uname 等)。假设此类命令的数量为 N,那么您的程序将创建 N 个子进程,每个子进程执行 N 个命令中的一个。我该怎么办?
    • @TomLouie 首先你必须自己做,然后如果你有特定的问题,你可以回到这里提出一个新的问题。
    【解决方案2】:

    听到您的问题,我仍然怀疑您是否想同时或一个一个地启动所有命令行参数作为一个进程。?

    如果需要同时做:

    您可以使用管道在父进程和子进程之间进行通信。就像您可以创建一个全局数据结构一样,对于每个 fork 和 exec,您可以填充数据结构并将其写入管道,父进程将在完成后读取并显示结果。

    你可以在下面看到我的示例代码:

     #include <stdio.h>
     #include <sys/types.h>
     #include <sys/wait.h>
     #include <stdlib.h>
     #include <unistd.h>
     #include <string.h>
     #include <errno.h>
    
     # define MAX_PROCESS 10
    
     typedef struct c_state child_stat;
    
    
     int main(int argc,char *argv[])
     {
     FILE *fp;
     pid_t child_pid[MAX_PROCESS];
     int status[MAX_PROCESS];
     int i=1;
    
    switch(fork())
    {
      case 0:
      for(i=1;i<argc;i++)
      {
     child_pid[i]=vfork();
     switch(child_pid[i])
     {
       case -1:
          printf("Error creating main child\n");
          abort();
          break;
       case 0:
             if(argv[i]==NULL)
             break;
         else
         status[i]=execl(argv[i],argv[i],(char*)NULL);
         if(status[i]==-1)
             exit(-1);
         break;
       default :
          printf("\ncommand : %s \n pid : %d\n status=%d\n",argv[i],child_pid[i],status[i]);
          break;
       }
     }
       default:
        wait(NULL);`enter code here`
        printf("\nAll done !! bye bye\n");
      }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多