LINUX.ORG.RU

История изменений

Исправление cudeta, (текущая версия) :

не могут быть потеряны

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

Этот код у меня выводит 15608, хотя, если они «не могут быть потеряны», то должно быть 100000.

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

static int n = 0;

static void sighandler(int signo)
{
    (void) signo;
    for (int i = 0; i < 100000; ++i) {
        asm volatile ("" ::: "memory");
    }   
    ++n;
}   

int main()
{
    signal(SIGRTMIN, sighandler);
    
    pid_t parent = getpid();
    
    pid_t child = fork();
    if (child < 0) {
        perror("fork");
        return 1;
        
    } else if (child == 0) {
        for (int i = 0; i < 100000; ++i) {
            kill(parent, SIGRTMIN); 
        }   
        return 0;
        
    } else {
        waitpid(child, NULL, 0);
        sleep(5);
        printf("%d\n", n);
        return 0;
    }   
}   

Исходная версия cudeta, :

не могут быть потеряны

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

Этот код у меня выводит 15608, хотя, если они «не могут быть потеряны», то должно быть 100000.

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

static int n = 0;

static void sighandler(int signo)
{
    (void) signo;
    for (int i = 0; i < 100000; ++i) {
        asm volatile ("" ::: "memory");
    }   
    ++n;
}   

int main()
{
    signal(SIGRTMIN, sighandler);
    
    pid_t parent = getpid();
    
    pid_t child = fork();
    if (child < 0) {
        perror("fork");
        return 1;
        
    } else if (child == 0) {
        for (int i = 0; i < 100000; ++i) {
            kill(parent, SIGRTMIN); 
        }   
        return 0;
        
    } else {
        waitpid(child, NULL, 0);
        sleep(5);
        printf("%d\n", n);
        return 0;
    }   
}