URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3819
[ Назад ]

Исходное сообщение
"сбрасуеться sleep() если делать kill(), как избавиться?"

Отправлено ssa , 13-Янв-05 03:26 
возникла проблемка:
есть два процесса:

посылальшик:

#include <stdio.h>
#include <signal.h>

int main(int argc, char* argv[]) {

  if(argc < 2) {
    printf("no args\n");
    exit(1);
  }

  int clpid = atoi(argv[1]);
  if(clpid > 0) {
    printf("send request to (pid=%d)\n", clpid);
    kill(clpid, SIGUSR1);
  }
  return(0);
}

и принимальщик:

#include <stdio.h>
#include <signal.h>

void act(int nsig) {
  signal(SIGUSR1, act);
}

int main(void) {
  printf("client (pid=%d)\n",getpid());
  signal(SIGUSR1, act);
  while(1) {
    printf("sleeping 100\n");
    sleep(100);
  }
}

и вот та в чЁм проблемка, когда посылаю сигналчик, то sleep() "обнуляеться", тоесть спонтом всЁ его время прошло и он выходит из слипа...
можно как нить сделать чтоб сигналы не трогали слип??

з.ы.: такая штука не подходит по другим соображениям:
вместо sleep(100) подставлять
cnt=10; while(cnt--) sleep(10);


Содержание

Сообщения в этом обсуждении
"сбрасуеться sleep() если делать kill(), как избавиться?"
Отправлено Xenu , 13-Янв-05 08:52 
Если верить man'ам то избежать этого нельзя.
man sleep
можно попробовать использовать pause() или select() или pselect()
это зависит от задачи которую пытаетесь решить.

"сбрасуеться sleep() если делать kill(), как избавиться?"
Отправлено gyn61 , 13-Янв-05 09:39 
>Если верить man'ам то избежать этого нельзя.
>man sleep
>можно попробовать использовать pause() или select() или pselect()
>это зависит от задачи которую пытаетесь решить.

Ну не совсем так. sleep() возвращает количество "недоспанных" секунд. Можно сделать так:

seconds = 100;
while (seconds > 0)
  seconds = sleep(seconds);


"сбрасуеться sleep() если делать kill(), как избавиться?"
Отправлено Xenu , 13-Янв-05 21:39 
Ну вот, опять я не дочитал man :-)

"сбрасуеться sleep() если делать kill(), как избавиться?"
Отправлено ssa , 13-Янв-05 12:04 
та задача такая шо надо спать и не мешать.. )) время проца зря не гонять))

"сбрасуеться sleep() если делать kill(), как избавиться?"
Отправлено chip , 16-Янв-05 11:34 
>возникла проблемка:
>есть два процесса:
>
>посылальшик:
>
>#include <stdio.h>
>#include <signal.h>
>
>int main(int argc, char* argv[]) {
>
>  if(argc < 2) {
>    printf("no args\n");
>    exit(1);
>  }
>
>  int clpid = atoi(argv[1]);
>  if(clpid > 0) {
>    printf("send request to (pid=%d)\n", clpid);
>    kill(clpid, SIGUSR1);
>  }
>  return(0);
>}
>
>и принимальщик:
>
>#include <stdio.h>
>#include <signal.h>
>
>void act(int nsig) {
>  signal(SIGUSR1, act);
>}
>
>int main(void) {
>  printf("client (pid=%d)\n",getpid());
>  signal(SIGUSR1, act);
>  while(1) {
>    printf("sleeping 100\n");
>    sleep(100);
>  }
>}
>
>и вот та в чЁм проблемка, когда посылаю сигналчик, то sleep() "обнуляеться",
>тоесть спонтом всЁ его время прошло и он выходит из слипа...
>
>можно как нить сделать чтоб сигналы не трогали слип??

использовать sigprocmask()

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int
main(int argc, char *argv[])
{
  sigset_t mask, old;
  
  sigemptyset(&mask);
  sigemptyset(&old);
  sigfillset(&mask);
  
  fprintf(stderr, "pid = %d\n", getpid());
  sigprocmask(SIG_SETMASK, &mask, &old);
  sleep(100);
  sigprocmask(SIG_SETMASK, &old, NULL);
  
  return 0;
}

на соседней консоли пробуем kill -INT <pid> - все замечательно работает. Убить процесс можно kill -9 <pid>