1 | ||||||
Необычное поведение при использовании каналов из <unistd.h>12.12.2016, 04:18. Показов 1252. Ответов 3
Нужно написать программу на Си использующую несколько процессов. При написании столкнулся с необычной проблемой. При вызове
write(pipe[1], string, strlen(stirng) в стандартный вывод подаётся содержимое строки. Сама программа выглядит вот так:
Код
TROLOLO Hello, world! Continue Hello, world! } И, в дополнение, когда нужно вызывать wait()? До закрытия канала и считывания или после? Ну и раз уж зашла речь о wait(), почему при компиляции ( clang source.c ) я получаю следующий варнинг и как мне его не получать (гугл не помог):Код
hello.c:37:9: warning: implicit declaration of function 'wait' is invalid in C99 [-Wimplicit-function-declaration] wait();
0
|
|
12.12.2016, 04:18 | |
Ответы с готовыми решениями:
3
Необычное поведение цикла for Необычное поведение у цикла
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
|
12.12.2016, 08:02 | 2 |
0
|
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
|
|||||||||||
12.12.2016, 08:06 | 3 | ||||||||||
Кликните здесь для просмотра всего текста
Мы хотим, чтобы родительский процесс дождался завершения дочернего процесса и вывел сообщение о том, как был завершен дочерний процесс. Первую часть этой задачи мы могли бы решить с помощью уже известного нам механизма сигналов. Каждый раз, когда дочерний процесс приостанавливается или завершается, родительский процесс получает сигнал SIGCHLD. Мы могли бы приостановить работу программы до получения этого сигнала, но таким образом мы бы знали только то, что один из дочерних процессов программы завершился, но не знали бы, ни как он завершился, ни какой именно это был процесс. Причина этого конечно, в том, что сигналы сами по себе не несут никакой дополнительной информации. Однако, в нашем распоряжении есть функция wait(2), которая приостанавливает процесс до тех пор, пока один из его дочерних процессов не будет остановлен или не завершится, после чего возвращает информацию о том, какой процесс завершился и что стало причиной его завершения. Значение, возвращаемое функцией wait() – это PID завершившегося процесса, а аргументом функции должен быть указатель на переменную status типа int. В этой переменной функция вернет дополнительные сведения о том, как завершился процесс. Вы могли подумать, что после того как мы создали два процесса с помощью fork(), не так уж важно, запускаем ли мы новую программу в дочернем или в родительском процессе, ведь разница между ними невелика. Теперь вы знаете как минимум одну причину придерживаться строгих правил, ведь родительский процесс может следить за дочерним, в то время как обратное невозможно.
Значение переменной status, в которой функция wait() передает дополнительные данные о завершившемся процессе, представляет собой маску из нескольких разных параметров. В файле <sys/wait.h> определены макросы, упрощающие «расшифровку» этой маски. Макрос WIFEXITED возвращает значение 1, если процесс завершился «добровольно», то есть в результате вызова exit() или _exit(). В этом случае с помощью макроса WEXITSTATUS можно узнать код завершения, возвращенный процессом. Макрос WIFSIGNALED возвращает 1, если выполнение процесса было завершено сигналом. Номер этого сигнала можно узнать с помощью макроса WTERMSIG. Макрос WIFSTOPPED возвращает значение 1, если выполнение процесса было приостановлено сигналом, номер которого возвращает макрос WSTOPSIG.
1
|
12.12.2016, 08:22 | 4 |
Чёт не вижу где каналы создаются...
0
|
12.12.2016, 08:22 | |
Помогаю со студенческими работами здесь
4
Необычное поведение Необычное поведение оператора инкремента Распознавание речи и клавиатура - время ожидания - необычное поведение Странное поведение при использовании массива как параметра Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |