gpt4 book ai didi

c - 我如何在这个简单的 C shell 中设置超时?

转载 作者:行者123 更新时间:2023-11-30 17:27:23 24 4
gpt4 key购买 nike

现在的代码 fork 一个命令,并执行指定的次数。我是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 modify
void 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 modify
char readChar() {
char c = getchar();
while (getchar() != '\n');
return c;
}

// main method - program entry point
int 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;

}


}

最佳答案

基本上有两种解决方案:

  1. 每个 fork 进程都会在延迟一段时间后自行终止。在alarm(sec)的帮助下这很容易做到。这样的调用会让系统在指定的延迟后向调用进程发送 SIGALRM 信号。
  2. 父进程控制其子进程的生命周期。主要问题是避免忙等待。第二个问题是管理不同定时器的困难。一个基本的解决方案是建立一个与延迟相关的子表。然后,您可以使用 alarm() 捕获进程的 kill() 事件并使其超时,然后为该进程设置一个新的 alarm()续集...在调用警报后,父进程可以通过调用 wait() 安静地进入休眠状态。如果此类调用成功终止,您只需从表中删除进程即可。

关于c - 我如何在这个简单的 C shell 中设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26417348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com