Терминал сервера в C [дубликат]

Ниже приведен оптимизированный вариант вышеописанного метода RemoveInvalidXmlChars, который не создает новый массив для каждого вызова, тем самым подчеркивая GC необъяснимо:

public static string RemoveInvalidXmlChars(string text)
    {
        if (text == null) return text;
        if (text.Length == 0) return text;

        // a bit complicated, but avoids memory usage if not necessary
        StringBuilder result = null;
        for (int i = 0; i < text.Length; i++)
        {
            var ch = text[i];
            if (XmlConvert.IsXmlChar(ch))
            {
                result?.Append(ch);
            }
            else
            {
                if (result == null)
                {
                    result = new StringBuilder();
                    result.Append(text.Substring(0, i));
                }
            }
        }

        if (result == null)
            return text; // no invalid xml chars detected - return original text
        else
            return result.ToString();

    }
19
задан avakar 20 March 2010 в 23:30
поделиться

5 ответов

Это программа для обработки сигнала при нажатии Ctrl + c

Синтаксис для сигнальной функции: signal(signal name, function name);

#include<stdio.h>
#include<signal.h>  // for handling signal 

void signal_handler() 
{
    printf("Signal Handled here\n");
}

main() 
{
    printf("In main function..\n");

    // SIGINT is signal name create  when Ctrl+c will pressed 
    signal(SIGINT,signal_handler);  

    sleep(15);

    printf("In main after called from signal_handle \n");

}
2
ответ дан Federico Ponzi 21 August 2018 в 08:22
поделиться
  • 1
    signal() устарел и его следует избегать, где это возможно, почти все современные платформы (за исключением некоторых встроенных) предлагают sigaction(). – Tim Post♦ 29 May 2014 в 12:35

В вашем примере вам, скорее всего, не нужна рукоятка CTRL-C. «Сигнал (SIGINT, SIG_IGN)» кажется вам достаточным, если ваше приложение не должно обрабатывать SIGINT, исходящий из какого-либо другого источника. CTRL-D обычно не генерирует сигналы, он просто передает состояние EOF. Вы можете вообще контролировать поведение вашего терминала (речь идет о консольном вводе, это не так), используя библиотеку termios (также здесь ). Вы можете включить, переопределить или отключить символ прерывания (CTRL-C), EOF один и многие другие (XON, XOFF, управление модемом ...)

С уважением

2
ответ дан Giuseppe Guerrini 21 August 2018 в 08:22
поделиться

Во-первых, Ctrl + D - индикатор EOF, который вы не можете захватить, когда программа ждет ввода, нажатие Ctrl + D означает конец файла и не ожидает больше ввода. С другой стороны, используя Ctrl + C для завершения программы - это SIGINT, которая может быть захвачена этим путем:

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

static void signal_handler(int);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);

struct sigaction sigact;
char *progname;

int main(int argc, char **argv){
    char *s;
    progname = *(argv);
    atexit(cleanup);
    init_signals();
    // do the work
    exit(0);
}

void init_signals(void){
    sigact.sa_handler = signal_handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = 0;
    sigaction(SIGINT, &sigact, (struct sigaction *)NULL);
}

static void signal_handler(int sig){
    if (sig == SIGINT) panic("Caught signal for Ctrl+C\n");
}

void panic(const char *fmt, ...){
    char buf[50];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(-1);
}

void cleanup(void){
    sigemptyset(&sigact.sa_mask);
    /* Do any cleaning up chores here */
}
14
ответ дан iBug 21 August 2018 в 08:22
поделиться
  • 1
    Обработчик SIG_IGN будет соответствовать потребностям OP. – outis 20 March 2010 в 23:56
  • 2
    – Jonathan Leffler 21 March 2010 в 00:11
  • 3
    @JonathanLeffler: Не могли бы вы объяснить мне лучше, почему не хорошая идея объявить sigact global, пожалуйста? Я хотел бы понять этот момент. Спасибо. – Kyrol 4 November 2013 в 00:56
  • 4
    @Kyrol: Нет необходимости, чтобы это была глобальная переменная; он вполне может быть локальной переменной в функции, поскольку он используется только внутри функции. Ядро копирует нужную информацию из структуры при вызове sigaction(); после этого вам не нужно сохранять значение. – Jonathan Leffler 4 November 2013 в 01:13
  • 5
    @JonathanLeffler: Большое вам спасибо. Ты прав! – Kyrol 4 November 2013 в 01:39
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
void signal_catch()
{
    printf("hi,Your signal catched Here");  
}
int main()
{
    signal(SIGINT,signal_catch);
//press ctrl+c
    sleep(10);
    return 0;
}//end main

//if you want to simply ignore ctrl+c interrupt use following code in main

int main()
{
    signal(SIGINT,SIG_IGN);
    sleep(100);
    return 0;
}//end main  
//this program  wont accept ctrl+c interrupt for 100 seconds. 
0
ответ дан Sherlock 21 August 2018 в 08:22
поделиться

При работе с сигналами POSIX у вас есть два средства. Во-первых, легкий (но устаревший) способ, signal () . Во-вторых, более элегантный, текущий, но сложный способ, sigaction () . Используйте sigaction (), если вы не обнаружите, что он недоступен на какой-либо платформе, над которой вам нужно работать.

В этой главе руководства glibc объясняются различия между ними и дает хороший пример кода о том, как использовать оба. Он также перечисляет сигналы, которые можно обрабатывать, рекомендует, как они должны обрабатываться и более подробно рассказывать о том, как указать, какой какой-либо данный сигнал (или нет) в настоящее время равен обработано. Это больше кода, чем я хотел бы вставить в ответ здесь, следовательно, ссылки.

На самом деле стоит час или два, чтобы вы могли прочитать ссылки и работать с примерами. Обработка сигналов (особенно в программах, которые демонизируют) чрезвычайно важна. Хорошая программа должна обрабатывать все фатальные сигналы, которые могут обрабатываться (например, SIGHUP), и явно игнорировать сигналы, которые он может не использовать (например, SIGUSR1 / SIGUSR2).

Также не помешает изучить разницу между нормальными и реальными сигналами времени, по крайней мере, до понимания того, как ядро ​​объединяет предыдущее, а не последнее.

После того, как вы его проработаете, вы, вероятно, почувствуете склонность писать простой набор функций для обработки ваших сигналов и повторного использования этого кода снова и снова.

Извините, что вы не даете быстрый и грязный фрагмент кода, чтобы показать вам, как решить вашу неотложную задачу, но это не быстрый и грязный вопрос:)

31
ответ дан Tim Post 21 August 2018 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: