Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
Показать сообщение отдельно
loorke
2 / 2 / 1
Регистрация: 03.12.2016
Сообщений: 11
Записей в блоге: 1

Необычное поведение при использовании каналов из <unistd.h> - C Linux

12.12.2016, 04:18. Просмотров 431. Ответов 3
Метки (Все метки)

Нужно написать программу на Си использующую несколько процессов. При написании столкнулся с необычной проблемой. При вызове write(pipe[1], string, strlen(stirng) в стандартный вывод подаётся содержимое строки. Сама программа выглядит вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>
 
 
int main(void) 
{
    int clientPipe[2];
    int* size = malloc(sizeof(int));
    char string[] = "Hello, world!\n";
 
 
    pid_t childpid;
    
    if ((childpid = fork()) == -1) {
        perror("fork");
        exit(1);
    } else if (childpid == 0) {
        /* Client */
 
        close(clientPipe[0]);
 
/*        scanf("%d", size);*/
/*        printf("%d\n", *size);*/
        /* write(clientPipe[1], size, sizeof(int)); */
        write(clientPipe[1], string, sizeof(string));
        printf("TROLOLO\n");
 
/*        time_t rawtime;*/
/*        srand(rawtime);*/
        exit(0);
    } else {
        /* Server */
    
        wait();
        close(clientPipe[1]);
        printf("Continue\n");
        *size = read(clientPipe[0], string, sizeof(string));
        printf("%s", string);
/*        read(clientPipe[0], size, sizeof(int));*/
/*        printf("%d\n", *size);*/
    }
       
    return(0);
}
Вывод при запуске следующий:
Код
TROLOLO
Hello, world!
Continue
Hello, world!
}
Почему 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();

http://www.cyberforum.ru/php-beginners/thread1169253.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2016, 04:18
Готовые ответы и решения для C Linux Необычное поведение при использовании каналов из <unistd.h>:

Необычное поведение цикла for
Label1-&gt;Caption = &quot;Âñåãî ïàðòèé: &quot; + IntToStr(VsegoPart); for(i=0;...

Необычное поведение порта
Добрый день уважаемые форумчане. У меня к вам вопрос. Можно ли файерволл...

Необычное поведение холста
Привет;) Возможно я слишком устал, ну или болен, не знаю. Но у меня не...

Необычное поведение &nbsp;
&amp;nbsp; отображается на сайте в виде мягкого знака, картинку прилагаю: del ...

Необычное поведение оператора инкремента
Добрый день! Это просто несчастье какое-то. Я пытаюсь посчитать коэффициенты...

3
Необычное поведение при использовании каналов из <unistd.h> C Linux   Следующее сообщение темы 
Другие темы раздела
C Linux Разработка GUI под linux http://www.cyberforum.ru/c-linux/thread1874512.html
Помогите выбрать высокоуровневый C-подобный ЯП с графической (оконной) библиотекой. Но что-то более высокоуровневое, чем C++. Важно, что бы была среда разработки с дизайнером окон. Большим плюсом...
C Linux Программа для работы моста Помогите пожалуйста, очень важно: В вычислительной системе моделируется работа разводного моста через один из рукавов реки. По мосту разрешено одностороннее движение. На мосту может находиться... http://www.cyberforum.ru/c-linux/thread1873260.html
C Linux Записать в распределенную память кодом Си считать оттуда значение кодом PHP
Просьба помочь с решением данной задачи, имеется код #include <stdio.h> #include <time.h> #include <sys/types.h> int num; // Переменная для цикла основной программы // ==== установка...
Составьте задачу C Linux
Составьте программу для вычисления X=(O+M)*(P+2) O - сумма отрицательных элементов массива M - наибольший элемент массива P - произведение элементов массива с нечетными номерами Полученные...
C Linux Как сделать библиотеки для создания каталога? http://www.cyberforum.ru/c-linux/thread1872430.html
У меня программа,которая создает каталог. Как мне разработать для этого библиотеку? #include<stdio.h> #include<sys/stat.h> int main (int argc,char ** argv) { if (argc < 2) {...
C Linux Написать программу подсчета количества блоков на "C Unix" Добрый день! Прошу помочь, нужны советы или пример кода, или конечно сам код. Программирование на языке C в среде ОС UNIX с использованием си-стемных вызовов (обмен информацией между... подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru