The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"сбрасуеться sleep() если делать kill(), как избавиться?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"сбрасуеться sleep() если делать kill(), как избавиться?" 
Сообщение от ssa emailИскать по авторуВ закладки(??) on 13-Янв-05, 03:26  (MSK)
возникла проблемка:
есть два процесса:

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

#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);

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "сбрасуеться sleep() если делать kill(), как избавиться?" 
Сообщение от Xenu Искать по авторуВ закладки on 13-Янв-05, 08:52  (MSK)
Если верить man'ам то избежать этого нельзя.
man sleep
можно попробовать использовать pause() или select() или pselect()
это зависит от задачи которую пытаетесь решить.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "сбрасуеться sleep() если делать kill(), как избавиться?" 
Сообщение от Xenu emailИскать по авторуВ закладки on 13-Янв-05, 21:39  (MSK)
Ну вот, опять я не дочитал man :-)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "сбрасуеться sleep() если делать kill(), как избавиться?" 
Сообщение от ssa emailИскать по авторуВ закладки(ok) on 13-Янв-05, 12:04  (MSK)
та задача такая шо надо спать и не мешать.. )) время проца зря не гонять))
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "сбрасуеться sleep() если делать kill(), как избавиться?" 
Сообщение от chip emailИскать по авторуВ закладки(ok) on 16-Янв-05, 11:34  (MSK)
>возникла проблемка:
>есть два процесса:
>
>посылальшик:
>
>#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>

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру