C程序告诉用户哪个子进程首先完成

时间:2017-12-05 23:57:21

标签: c process fork

我正在处理涉及使用fork的作业。该程序同时运行两个独立的程序,并告诉用户哪一个先完成。如果孩子完成,另一个仍在跑步的孩子应该立即被杀死。 到目前为止我的代码就是这个......

int main(int argc, char **argv) {

  if (argc != 2) {
    perror("Invalid number of arguments!");
    exit(1);
  }
  pid_t pid;
  pid_t wpid;
  int status = 0;

  for (int i = 0; i < 2; i++) {
    if ((pid = fork()) == 0) {
      execv("/bin/sh", argv[i+1]);
    } 
  }
  while ((wpid = wait(&status)) > 0);
  printf("%s finished first!", <Insert winning program here>);
  return 0;
}

根据我的理解,这会运行程序,并且在子进程完成之前不会让父进程继续。现在我想知道如何终止另一个孩子并返回获胜过程。

1 个答案:

答案 0 :(得分:1)

  

但是我怎样才能立即获得失败过程的优势,以便我可以杀死它?

就像TonyB所说:“父母”保存新孩子的pid。 2)更详细:保存两个孩子的PID,等待任何一个,将返回值与保存的PID之一进行比较。匹配的人是赢家,不匹配的人是输家。例如:

#define _POSIX_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

int main(int argc, char **argv)
{
  if (argc != 3)    // with two program arguments, argc is 3
    fputs("Invalid number of arguments!\n", stderr), exit(EXIT_FAILURE);
  pid_t pid[2];     // to store both child pids
  pid_t wpid;
  for (int i = 0; i < 2; i++)
    if ((pid[i] = fork()) == 0)
      execl("/bin/sh", "sh", "-c", argv[i+1], NULL),
      perror(argv[i+1]), exit(EXIT_FAILURE);
  wpid = wait(NULL);                    // wait for first
  int wi = wpid==pid[0] ? 0 : 1;        // get index of winner
  kill(pid[!wi], SIGKILL), wait(NULL);  // kill and reap loser
  printf("%s finished first!\n", argv[wi+1]);
  return 0;
}