退出C中的过程值

时间:2015-12-28 20:03:50

标签: c unix signals fork

在这段代码中,我收到一些命令,将它们转换为数组并在进程中执行它们。

我的问题是如何创建一个超过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]);
    }

2 个答案:

答案 0 :(得分:0)

你可以:

  1. 陷阱SIGCHLD抓住孩子终止并通过调用wait删除僵尸,并在所有进程终止时删除超时
  2. 为超时设置闹钟并抓取SIGALRMkill剩余进程,wait删除僵尸
  3. sigsuspendpause您的流程让它等待某些事件

答案 1 :(得分:0)

  

我的问题是如何制作一个超过的过程   exec_timeout秒终止?

在子进程中,sleep(exec_timeout+1)