现在的代码现在将派生一个命令,并执行指定的次数。我是C语言的新手,对语法了解不多。基本上,我希望能够为我正在制作的不同流程设置最大持续时间,并在达到该持续时间时终止该流程。#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <signal.h>#include <time.h>#define TRUE 1#define FALSE 0// tokenize the command string into arguments - do not modifyvoid readCmdTokens(char* cmd, char** cmdTokens) { cmd[strlen(cmd) - 1] = '\0'; // drop trailing newline int i = 0; cmdTokens[i] = strtok(cmd, " "); // tokenize on spaces while (cmdTokens[i++] && i < sizeof(cmdTokens)) { cmdTokens[i] = strtok(NULL, " "); }}// read one character of input, then discard up to the newline - do not modifychar readChar() { char c = getchar(); while (getchar() != '\n'); return c;}// main method - program entry pointint main() { char cmd[81]; // array of chars (a string) char* cmdTokens[20]; // array of strings int count; // number of times to execute command int parallel; // whether to run in parallel or sequentially int timeout; // max seconds to run set of commands (parallel) or each command (sequentially) while (TRUE) { // main shell input loop // begin parsing code - do not modify printf("clonsh> "); fgets(cmd, sizeof(cmd), stdin); if (cmd[0] == '\n') continue; readCmdTokens(cmd, cmdTokens); do { printf(" count> "); count = readChar() - '0'; } while (count <= 0 || count > 9); printf(" [p]arallel or [s]equential> "); parallel = (readChar() == 'p') ? TRUE : FALSE; do { printf(" timeout> "); timeout = readChar() - '0'; }while (timeout < 0 || timeout > 9); // end parsing code //////////////////////////////////////////////////////// // // // TODO: use cmdTokens, count, parallel, and timeout // // to implement the rest of closh // // // // ///////////////////////////////////////////////////// int pid; //clock_t myClock; for (int i=0;i<count; i++) { pid = fork(); if (pid == 0) { printf("My process ID : %d\n", getpid()); //printf("My parent process ID : %d\n", getppid()); execvp(cmdTokens[0], cmdTokens); } /*myClock=clock(); if (myClock>9000000) kill (pid, SIGKILL);*/ }return 0; }} 最佳答案 基本上有两种解决方案:每个分叉的过程在延迟一段时间后都会自杀。在alarm(sec)的帮助下,这很容易做到。这样的调用将使系统在指定的延迟后向呼叫进程发送SIGALRM信号。父进程控制子进程的生命周期。主要问题是避免繁忙的等待。第二个问题是难以管理不同的计时器。一个基本的解决方案是拥有一个与延迟相关联的子代表。然后,您可以使用alarm()来捕获和超时kill()进程的事件,然后为续集设置一个新的alarm()。在发出警报后,父进程可以通过调用。如果这样的调用成功终止,则只需要从表中删除进程即可。
09-26 17:53