![]() |
|
Модераторы: xvr |
![]()
|
|
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Здравствуйте!
Пытаюсь передать стринг между двумя дочерними процессами. ниже листинги программ. В чем проблема? на линуксе недавно программирую. pipe.c #include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<string.h> int main( int argc, char *argv[], char *envp) { int fd[2], result, result1; char resstring[14]; if (pipe<0) { printf("Can't creat pipe\n"); exit(-1); } result=fork(); if (result<0) { printf("Can't fork child1\n"); exit(-1); } else if (result==0) { result1=fork(); if (results1<0) { printf("Can't fork child2\n"); exit(-1); } else if (result==0) { execle("root/child2","root/child2",0,envp); } else { printf("This is child1\n"); close(fd[1]); size=read(fd[0],resstring,14); if (size!=14) { printf("Can't read all string\n"); exit(-1); } close(fd[0]); printf("%s",resstring); } } else { printf("This is parent\n"); exit(-1); } return 0; } child2.c #include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<string.h> int main( i) { int fd[2]; size_t size; char resstring[14]={"HELLO, WORLD!"}; close(fd[0); size=write(fd[1],resstring,14); if (size!=14) { printf("Can't write all string\n"); exit(-1); } close(fd[1]); return 0; } При запуске выдает сообщения: This is child2 Can't write string This is child1 This is parent Can't read all string |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 3 Всего: 33 |
Добавлено @ 01:31
опечатка что за дескриптор fd[0] ? что за дескриптор fd[1] ? кто такой pipe ? Ты для начала код откомпилируй.
странно это все. должен выдать сигфаулт. он даже компилироваться не должен. Первый точно не скомпилиться. Это сообщение отредактировал(а) andrew_121 - 12.8.2009, 01:36 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Извиняюсь действительно при подачи листинга программы допустил ошибки, а в программе стоят if(pipe(fd<0) и close(fd[0]). программы компилируются и при запуске создаться два дочерних процесса, а вот передачи стринга не происходит.
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 3 Всего: 33 |
olegsml, Поправь исходный код. И заключи его в теги "
Второе. Ты используешь дескрипторы: но я не вижу чтоб ты их проинициализировал. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
а зачем дескрипторы инициализировать? в аналогичной программе передачи стринга между родителем и сыном использую декларацию int fd[2] и все работает
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Сын от родителя fork'ом получен? Тогда и fd он унаследовал от родителя. exec'же стирает ВСЕ, что было у родителя (включая fd), и сын начинает жизнь с 'чистого листа'. Дескрипторы надо передавать не через память (и уж тем более не через абсолютно разные переменные даже если они и называются одинаково |
||||
|
|||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
вместо того что бы забором пугать, взял бы и привел пример как связать эти дескрипторы
|
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Например передать как параметры командной строки. Вместо этого
Или делать dup2 их на stdio/stdout (как обычно все и делают) |
||||||||
|
|||||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 3 Всего: 33 |
Ну... Не нужно так! Вам тут никто ничего не должен! По обходительней пожалуйста По теме.
Код в студию! -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
я не хотел обидеть, но если все таки обидел то искренно извиняюсь.
большое спасибо за примеры. внес изменения и все заработало. а можно поподробнее с функциями dup2(). пожалуйста код программы для обмена родителя и сына( взят из книги "Основы операционных систем" В.Е. Карпов, К.А. Коньков) #include<sys/types.h> #include<unistd.h> #include<stdio.h> int main( ) { int fd[2], result; size_t size; char resstring[14]; if (pipe(fd)<0) { printf("Can't creat pipe\n"); exit(-1); } result=fork(); if (result<0) { printf("Can't fork child1\n"); exit(-1); } else if (result>0) { close(fd[0]); size=write(fd[1],"HELLO, WORLD!",14); if (size!=14) { printf("Can't write all string\n"); exit(-1); } close(fd[1]); printf("Parent exit\n"); } else { close(fd[1]); size=read(fd[0],resstring,14); if (size<0) { printf("Can't read string\n"); exit(-1); } printf("%s\n",resstring); close(fd[0]); } return 0; } |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Можно. В родителе (перед exec) делаешь
Если же потомок запускается через exec, то так делать нельзя, т.к. при exec память очищается |
||||||
|
|||||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
можно поподробнее? |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Куда уж подробнее - обычный printf или write(1,...); |
||||
|
|||||
| olegsml |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Разобрался. Огромное спасибо.
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 3 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |