У меня проблема в C с execve после форка. Мне нужно создать 20 детей, и только когда они будут успешно созданы, я буду делать что-то. Я использую для этого семафор, но он все еще не работает, потому что в файле execve, который я запускаю после форка, он читает последние 2 или 3 дочерних элемента. Но я хочу "остановить" файл и заставить его ждать создания.
Взгляните на мой код: Father.c
system("gcc person.c -o Person");
for(i = 0; i < NUM_PEOPLE; i++){
if((pidprocesso = fork()) == 0) {
// Insert in one struct
insertInStruct(randType, randName, randDna, getpid(), 1, i);
// Semaphore that have init val to NUM_PEOPLE
reserve(sem_totchild); // This make a -1 operation
char *argv[] = {"0", "1", "2", "stuff", NULL};
execve("./Person", argv, NULL);
}
}
человек.с
while((semctl(sem_totchild, 0, GETVAL)) > 0){
// Something to wait the end of creation
// And I can't use sleep()
}
// Code that will run after creation
Очевидно, я хорошо связал семафор во всех двух файлах.
semop()
сsemval
равным 0. Если семпахора инициируется до 20 и уменьшается на единицу, а также каждое дочернее создание, у вас будет рандеву. - person Jean-Baptiste Yunès   schedule 05.12.2017argv
сообщают программеPerson
, что она называется0
. Сexecve()
приходит большая сила и ответственность; вы можете называть программу как угодно, но вы должны называть ее как-то. Из вашего кода неясно (который не является MCVE (минимальный воспроизводимый пример), я отмечаю), почему вы думаете, что семафоры System V IPC будут доступны в кодеperson.c
; вы не показали, как он соединяется с семафорами и т. д. Я думаю, вам следует использоватьsemop()
, а неsemctl()
. - person Jonathan Leffler   schedule 05.12.2017char *argv[] = {"0", "1", "2", "stuff", NULL}; execve("./Person", argv, NULL);
это неправильно, должно быть:char *argv[] = {"Person", "0", "1", "2", "stuff", NULL}; execve("*argv, argv, NULL); perror( "execve failed"); exit( EXIT_FAILURE );
- person user3629249   schedule 06.12.2017/
. Правильная функция для вызова общего/именованного семафора:sem_open()
- person user3629249   schedule 06.12.2017semop()
сsemval
равным 0, вы имели в виду … сsem_op
равным 0? - person Armali   schedule 23.08.2019