1
#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!” 在它本身终止之前。我需要关于完成和错误检查的代码帮助。请帮忙,谢谢!

4

2 回答 2

1

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

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

于 2013-10-25T07:11:09.197 回答
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");
  }
 }
于 2013-10-28T13:50:58.883 回答