Только один процесс должен выполнять часть кода за раз - PullRequest
1 голос
/ 25 мая 2011

Извините, я повторяю вопрос https://stackoverflow.com/questions/5687837/monitor-implementation-in-c, но пока не могу найти решение. Я, вероятно, задал вопрос неправильно.

Скажем, у меня есть часть кода B. Родительский процесс порождает несколько дочерних процессов для выполнения кода B, но я бы хотел, чтобы только один процесс находился внутри части кода B одновременно. Как я могу сделать это в C на платформе Linux?

Спасибо за вашу помощь

Ред. Не темы, а процесс.

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

Вы хотите мьютекс.

pthread_mutex_t mutexsum;
pthread_mutex_init(&mutexsum, NULL);
pthread_mutex_lock (&mutexsum);
// Critical code
pthread_mutex_unlock (&mutexsum);

Если вы серьезно относитесь к нескольким процессам вместо нескольких потоков, мьютекс необходимо сохранить в сегменте общей памяти.

0 голосов
/ 25 мая 2011

Итак, вы хотите, чтобы в любой момент времени был запущен ровно один дочерний процесс, тогда зачем порождать все дочерние процессы одновременно?

Когда дочерний процесс завершается, выдается SIGCHLD, вы можете написать свой собственный обработчик для этого сигнала и вызвать spawn из обработчика.Тогда у вас есть один новый дочерний процесс, созданный, когда один из них погибает - только один дочерний процесс запущен.Ниже приведен хак (бесполезный, только для демонстрации), чтобы добиться этого:

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

void spawn(void){

    pid_t child_pid=fork();

    if(child_pid > 0){
        printf("new child created by %d !\n",getpid()); 
        sleep(1);
    }else if(child_pid == 0){
        printf("child %d created !\n",getpid());

    }else{
        exit(EXIT_FAILURE);
    }
}


void handler(int sigval){
    spawn();    
}

int main(void){
    signal(SIGCHLD,handler);
    spawn();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...