在这段代码中,我收到一些命令,将它们转换为数组并在进程中执行它们。
我的问题是如何创建一个超过exec_timeout秒的进程来终止?
有任何帮助吗?
void exec_Task(int exec_timeout, char *args, int n){
signal(SIGALRM, handler);
int i=0;
int j=0;
int len;
int pa;
int flag;
pid_t p;
int fd[2];
const char s[2] = "|"; //sets the delimiter for the token
char *token;
char tasks[n][50];
wordexp_t wt; //warning cleaner
char **w; //wordexp related
token = strtok(args, s); // breaks the string into smaller strings whenever the char '|' appears
//token gets the value of the first substring
i =0;
while( token != NULL ) // walk through other tokens
{
strcpy(tasks[i],token); // inserts them in an 2D array
i++;
token = strtok(NULL, s);
}
for(i=0; i<(sizeof(tasks[0])-2); i++) //cleans the first task since it has the command char appanded
tasks[0][i]=tasks[0][i+2];
for(i=0;i<n ;i++){ //Number of commands to execute
pipe(fd);
p=fork(); //Creates child process
wordexp(tasks[i], &wt, 0);
w = wt.we_wordv;
if(p==0){
if(i<n-1){
close(fd[0]);
dup2(fd[1],1);
}
dup2(pa,0);
//executes command
if(execvp(w[0],w)== -1){
perror("execvp error");
}
_exit(1);
}
else{
close(fd[1]);
pa=fd[0];
}
}
for(i=0; i<n ;i ++){
int status=0, f=0;
printf("wifexited: %d\n",WIFEXITED(status));
wait(&status);
alarm(3);
pause();
kill(p,SIGKILL);
}
close(fd[1]);
}
答案 0 :(得分:0)
你可以:
SIGCHLD
抓住孩子终止并通过调用wait
删除僵尸,并在所有进程终止时删除超时SIGALRM
至kill
剩余进程,wait
删除僵尸sigsuspend
或pause
您的流程让它等待某些事件答案 1 :(得分:0)
我的问题是如何制作一个超过的过程 exec_timeout秒终止?
在子进程中,sleep(exec_timeout+1)
。