C сигналы и процессы - PullRequest
       9

C сигналы и процессы

1 голос
/ 23 апреля 2010

поэтому в основном я хочу, чтобы «cmd_limit» занимал число в секундах, которое является максимальным временем, которое мы будем ждать до завершения дочернего процесса (можно предположить, что он только один). Если дочерний процесс завершает работу во время сна, я хочу, чтобы cmd_limit возвращал pass, а не запускал остальную часть кода cmd_limit. Может ли кто-нибудь помочь мне сделать это, вот что у меня так далеко ..

int cmd_limit( int limit, int pid ) {

    signal( SIGCHLD, child_died );
    sleep( limit );
    kill( pid, SIGKILL );
    printf("killin'\n");
    return PASS;
}

void child_died( int sig ) {

    int stat_loc; /* child return information */
    int status; /* child return status */

    waitpid( -1, &stat_loc, WNOHANG );

    if( WIFEXITED(stat_loc) ) { // program exited normally
        status = WEXITSTATUS( stat_loc ); /* get child exit status */
    }

    printf("child died: %s\n", signal);

}

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

kill возвращает 0, если сигнал был отправлен, и -1, если сигнал не был отправлен. Сигнал не может быть отправлен, если процесс уже завершен, поэтому возвращаемое значение kill может использоваться, чтобы сообщить вам, был ли процесс уничтожен kill или уже мертв.

Кроме того, вы можете использовать один из системных вызовов wait для просмотра изменения состояния (включая выход) дочернего процесса.

Вам также следует изучить обработку сигналов в родительском процессе для SIGCHLD, которую родитель получит, когда дочерний объект изменит состояние (включая выход), и также выведет родителя из состояния сна (хотя в некоторых системах функция сна может возобновить сон).

Используя wait и / или SIGCHLD, вы можете быстрее завершить родительское задание, если ребенок ушел из школы в течение вашего срока.

Вы должны заметить, что вам, вероятно, следует вызвать wait для завершения дочерних процессов, чтобы вы не создавали зомби (процессы, которые вызвали exit, но должны быть сохранены на случай, если родитель захочет посмотреть их состояние выхода).

Еще одна вещь, которую вы захотите рассмотреть, это значение errno EINTR, которое могут быть установлены системными вызовами, если они были прерваны сигналом.

В командной строке введите:

man errno
man 2 wait
man 2 sigaction

для получения дополнительной информации о вещах, о которых я говорил.

1 голос
/ 23 апреля 2010

Вы просто имеете в виду что-то подобное?

bool childDied;

int cmd_limit( int limit, int pid ) {
    childDied = FALSE; 
    signal( SIGCHLD, child_died ); 
    sleep( limit ); 
    if (!childDied)
    {
      kill( pid, SIGKILL ); 
      printf("killin'\n"); 
    }
    return PASS; 
} 

void child_died( int sig ) {
    int stat_loc; /* child return information */ 
    int status; /* child return status */ 

    childDied = TRUE; 

    waitpid( -1, &stat_loc, WNOHANG ); 

    if( WIFEXITED(stat_loc) ) { // program exited normally 
        status = WEXITSTATUS( stat_loc ); /* get child exit status */ 
    } 

    printf("child died: %s\n", signal); 

} 
...