创建一个执行任何命令的进程

时间:2013-10-25 07:05:08

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

#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;
        }
    }
}

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

2 个答案:

答案 0 :(得分:1)

首先,wait函数会在等待时阻塞,因此第一部分(父节点在子出口处打印消息)应该非常简单。

至于退出之前的打印,就这样做。在printf中的最终return 0;之前添加main来电。

答案 1 :(得分:0)

听到您的问题仍然我怀疑您希望将所有命令行参数作为一个进程同时或一个一个地启动。

如果您需要同时进行:

您可以使用管道在父进程和子进程之间进行通信。就像你可以创建一个全局数据结构一样,对于每个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");
  }
 }