The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Не выключается питание"
Отправлено blackcat, 27-Ноя-05 14:58 
>Мне нужно делать это когда юзера не залогинились

собираеш простенькую схемку кнопки в СОМ-порт
и вешаеш в систему демона...
(с) не мои. Работает железобетонно (freebsd 4.11, 5.3)

------------------------КУСЬ...
Subject: Схема простого переключателя для последовательного порта

Схема переключателя с индикатором текущего режима, подключаемого к
последовательному порту и периодически запускающего один из 2 скриптов
в зависимости от режима переключателя.

switcher.c
------------

/*
Simple program to monitor the state of switcher and execute two
different scripts according to the state. Current state
is displayed by LED indicator

DB-9 Connector

    Pin   Signal                   Pin  Signal
-------------------------------------------------------------------
     1    CD   Carrier Detect       6   DSR  Data Set Ready
     2    RXD  Receive Data         7   RTS  Request to Send
     3    TXD  Transmit Data        8   CTS  Clear to Send
     4    DTR  Data Term. Ready     9   RI   Ring Indicator
     5    GND  Signal GND


Circuit diagram
DB9
1   DCD o-------------|------------|
4   DTR o---/\/\/\----|            |
              10k                  \\ switcher
                                    \\
                                   |                              
5   GND o--------------------------|          
                                -------
                                |  -  |
                                | LED |
                                |  +  |
7   RTS o---/\/\/\-----------------|
              1k


Author: Tigran Zakaryan tigr@irphe.am
*/

#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  int fd;
  int dtr_bit = TIOCM_DTR;
  int rts_bit = TIOCM_RTS;
  int flags, cntr_bits;
  int status, oldstat = -1;
  //
  if (argc < 4) {
        fprintf(stderr, "Usage: switcher <device> <script1> <script2>\\n");
        exit(1);
  }
  // Daemonize
  switch(fork()) {
    case 0: // Child
        setsid();
        break;
    case -1: // Error
        exit(1);
    default: // Parent
        exit(0);
  }
  if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
    exit(1);
  }
  // DTR should be high. Force it
  ioctl(fd, TIOCMGET, &cntr_bits);
  cntr_bits |= dtr_bit;
  ioctl(fd, TIOCMSET, &cntr_bits);
  // Sample the DCD line
  while(1) {
    // Get the status
    ioctl(fd, TIOCMGET, &flags);
    // Calculate present status
    status = (flags & TIOCM_CAR);
    // Did DCD drop to zero? (switch is "ON", light is "ON")
    if (oldstat != 0 && status == 0) {
      // Script1
      system(argv[2]);
      // Switch light "ON"
      ioctl(fd, TIOCMGET, &cntr_bits);
      cntr_bits |= rts_bit;
      ioctl(fd, TIOCMSET, &cntr_bits);
    }
    // Did DCD come up again? (switch is "OFF", light is "OFF")
    if ((oldstat == 0 && status != 0) || (oldstat == -1 && status != 0)) {
      // Script2
      system(argv[3]);
      // Switch light "OFF"
      ioctl(fd, TIOCMGET, &cntr_bits);
      cntr_bits &= ~rts_bit;
      ioctl(fd, TIOCMSET, &cntr_bits);
    }
    // Remember status and sleep for 1 second
    oldstat = status;
    usleep(1000000);
  }
  // Never happens
  return(0);
}


Makefile
-----------

CC=g++

all:        switcher

switcher:    switcher.c
        $(CC) -o switcher switcher.c
        chmod 700 switcher

clean:
        rm -f *~ core switcher

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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