Решено: Контрольные суммы файлов (Как реализовать подсчет?)

Модератор: Модераторы разделов

Hotwire
Сообщения: 12
ОС: Mandriva Linux 2008

Решено: Контрольные суммы файлов

Сообщение Hotwire »

Доброго времени суток. Необходимо написать прогу, которая читая из файла запускает то, что там написано с заданной задержкой(также указывается в файле). Злой преп, выпендрился и вписал в тот файл саму прогу, мне надо чтоб она ее на запускала, проверка на имя его не устраивает, он хочет, чтобы проверили контрольные суммы двух файлов(типа с одним названием файлы разные бывают)и только в случае совпадения не выполнять элемент из списка.
Есть ли какие библиотеки с такими функциями или исходник функции подсчета как-то достать можно?
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Решено: Контрольные суммы файлов

Сообщение SLEDopit »

а писать на чем угодно?)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Контрольные суммы файлов

Сообщение NickLion »

А запустить просто md5sum - нельзя? Алгоритм собственно из исходников этой проги можно взять. Можно простенький CRC32 сделать. Пример хоть в википедии взять можно.

PS а если я там пропишу скрипт, который Вашу прогу запускает? Как по мне, так лучше использовать проверку, а не запущена ли уже такая программа, а не контрольные суммы. Подумайте о семафорах, создании лок-файла или ещё чего-то подобного. Это способ получше.
Спасибо сказали:
Hotwire
Сообщения: 12
ОС: Mandriva Linux 2008

Re: Решено: Контрольные суммы файлов

Сообщение Hotwire »

Писать на Си
Как по мне, так лучше использовать проверку, а не запущена ли уже такая программа, а не контрольные суммы. Подумайте о семафорах, создании лок-файла или ещё чего-то подобного. Это способ получше.
Преп сказал реализовать именно так.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Контрольные суммы файлов

Сообщение NickLion »

Hotwire писал(а):
25.12.2009 18:57
Писать на Си
Как по мне, так лучше использовать проверку, а не запущена ли уже такая программа, а не контрольные суммы. Подумайте о семафорах, создании лок-файла или ещё чего-то подобного. Это способ получше.
Преп сказал реализовать именно так.

Дело Ваше :) Но я бы подстраховался. Вот если следующим шагом будет скрипт, запускающий фашу программу?
Спасибо сказали:
Hotwire
Сообщения: 12
ОС: Mandriva Linux 2008

Re: Решено: Контрольные суммы файлов

Сообщение Hotwire »

хочу запустить на исполнение прогу на коммандном интерпритаторе, но не выходит.
делаю через exec никакого эффекта. Можно ли как-то откомпилировать такую прогу7
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Решено: Контрольные суммы файлов

Сообщение eddy »

Объясните поподробней. Ничего не понятно: какие цели у программы? Что запускает программа: сценарии на баше, исходники, или что-то еще?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Hotwire
Сообщения: 12
ОС: Mandriva Linux 2008

Re: Решено: Контрольные суммы файлов

Сообщение Hotwire »

Программа должна была читать из файла и запускать команды с задержкой, которая так же была указана в файле. Хитрый преп в список вписывал саму прогу, ну и тогда машина висла. Реализовал через переменные окружения(не так как хотел преп, но надежней и короче, может оценит), контекст подменял через execvp. Все прекрасно заработало. Всем Спасибо за ответы
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Решено: Контрольные суммы файлов

Сообщение eddy »

Hotwire писал(а):
26.12.2009 03:10
Хитрый преп в список вписывал саму прогу

Хм, интересно, если в задания крона вписать сам крон, что будет?

Насчет проверок того, запущена ли уже какая-нибудь программа, можно сделать так:

Код: Выделить всё

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <getopt.h>
#include <pwd.h>

#define PROC_BASE "/proc"

void readname(char *name, pid_t pid){ // считать имя процесса из /proc/...
    char *pp = name, byte, path[256];
    int cntr = 0, file;
    sprintf (path, PROC_BASE "/%d/cmdline", pid);
    file = open(path, O_RDONLY);
    do{    // считываем имя без слешей
        read(file, &byte, 1);
        if (byte != '/') *pp++ = byte;
        else pp = name;
    }
    while(byte != EOF && byte != 0 && cntr++ < 255);
    close(file);
}

void killbrothers(){
    DIR *dir;
    struct dirent *de;
    pid_t pid, self;
    char name[256], myname[256];
    if (!(dir = opendir (PROC_BASE))){ // открываем директорию /proc
        perror (PROC_BASE);
        exit (1);
    }
    self = getpid(); // свой идентификатор
    readname(myname, self); // свое имя процесса
    while ((de = readdir (dir)) != NULL){ // пока не дойдем до конца директории
    // пропустим, если директория не указывает на процесс, или указывает на self
        if (!(pid = (pid_t) atoi (de->d_name)) || pid == self)
            continue;
        readname(name, pid); // считываем имя процесса
        if(strncmp(name, myname, 255) == 0){ // если оно совпадает с self
            #ifdef __TEST__
            fprintf(stderr, "Found running process...\nKilling\n");
            #endif
            kill(pid, 9); // убиваем без разговоров
            sleep(3); // подождем, пока процесс не умрет окончательно
        }
    }
    closedir(dir);
}

Соответственно, kill(pid, 9) можно заменить на что-либо другое.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали: