Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2012, 11:08   #1
Reginsi
Пользователь
 
Регистрация: 03.01.2012
Сообщений: 10
По умолчанию каналы и сигналы в си(я запуталась в задаче)

нужно написать программу в которой родительский процесс передает дочернему сообщение через канал, дочерний процесс печатает его, затем передает родительскому через канал свой пид, затем родительский процесс печатает его и посылает дочернему процессу сигнал после которого дочерний процесс завершается.
Reginsi вне форума Ответить с цитированием
Старый 04.01.2012, 12:52   #2
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Советую посмотреть в книге.
"Основы программирования в Linux". (Нейл Мэтью, Ричард Стоунс).
Там и по сигналам и форкам все отлично расписано с примерами кода.
AlexDark вне форума Ответить с цитированием
Старый 04.01.2012, 15:23   #3
Reginsi
Пользователь
 
Регистрация: 03.01.2012
Сообщений: 10
По умолчанию

Цитата:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
#include <sys/wait.h>



int main(){
int fd[2];
int p,status,d,b;
char s[6]="ffffff",*r;
char ch;
printf("%s",s);
printf("sss\n");
pipe(fd);

if( fork()==0){
close(0);
dup2(fd[0],0);
close(fd[1]);
b=read(fd[0],r,6);
printf("%s",r);
close(fd[0]);
exit(0);

}else{
close(1);

d=write(fd[1],s,6);
close(fd[1]);
close(fd[0]);
}
return 0;
}
все равно не получается все что там написано я уже читала, не совсем понимаю почему не работает следующий код для этой задаче если опустить про сигналы и пид

Последний раз редактировалось Reginsi; 04.01.2012 в 15:56.
Reginsi вне форума Ответить с цитированием
Старый 04.01.2012, 15:59   #4
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Зачем столько close() ?.

Все работает только под char *r нужно память в дочернем процессе выделить.

...
if( fork()==0){
...
char *r = new char[6];
b=read(fd[0],r,6);
printf("%s",r);
...
AlexDark вне форума Ответить с цитированием
Старый 04.01.2012, 15:59   #5
Reginsi
Пользователь
 
Регистрация: 03.01.2012
Сообщений: 10
По умолчанию

Код:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
#include <sys/wait.h>



int main(){
	int fd[2];
	int p,status,d,b;
	char s[6]="ffffff",*r;
	char ch;
		printf("%s",s);
	printf("sss\n");
	pipe(fd);
	   
	if(	fork()==0){
		close(0);
		dup2(fd[0],0);	 
		close(fd[1]);
	    b=read(fd[0],r,6);
	    printf("%s",r);
	    close(fd[0]);
	    exit(0);
	
   }else{
	   close(1);
	 
	   d=write(fd[1],s,6);
	   close(fd[1]);
	   close(fd[0]);
   }
return 0;
}
не понимаю почему не работает
Reginsi вне форума Ответить с цитированием
Старый 04.01.2012, 16:41   #6
Reginsi
Пользователь
 
Регистрация: 03.01.2012
Сообщений: 10
По умолчанию

спасибо большое))
Reginsi вне форума Ответить с цитированием
Старый 04.01.2012, 17:02   #7
Reginsi
Пользователь
 
Регистрация: 03.01.2012
Сообщений: 10
По умолчанию

двинулась дальше и опять не то


PHP код:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
#include <sys/wait.h>



int main(){
    
int fd[2];
    
int g,d,b;
    
char s[6]="ffffff";
    
char buf1[1],buf2[1];
    
pipe(fd);
       
    if(    
fork()==0){
        
char r[6];
        
int g;
        
dup2(fd[0],0);     
        
b=read(fd[0],r,6);
        
printf("%s",r);
        
close(fd[1]);
        
close(fd[0]);
        
dup2(fd[1],1);
        
g=getpid();
        
printf("%d",g);
        
buf1[0]=g;
        
b=write(fd[1],buf1,1);
        
close(fd[1]);        
        
close(fd[0]);
     }else{
       
d=write(fd[1],s,6);
       
kill(SIGKILL,buf2[0]);
       
d=read(fd[0],buf2,1);
       
g=buf2[0];
       
close(fd[1]);
       
close(fd[0]);
       
printf("%d",g);
   }
return 
0;

в родительском процессе печатает всегда 102, код символа f, как считать пид???

Последний раз редактировалось Reginsi; 04.01.2012 в 17:21.
Reginsi вне форума Ответить с цитированием
Старый 04.01.2012, 17:29   #8
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

в 1байт char'а пид не влезает =) поэтому 102.
Честно говоря сам не помню как правильнее его переслать...
AlexDark вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анонимные каналы RAZOR1703 Win Api 1 29.11.2011 21:47
Переключение каналов через пульт на 2-3 значные каналы sSsantasSs JavaScript, Ajax 71 07.07.2010 20:17
Ребят, я запуталась в своей задаче..( посмотрите, я правильно делаю?))) Neznakomka Помощь студентам 13 27.05.2009 20:27
Межпроцессное взаимодействие. Каналы. Zefick Win Api 3 02.03.2009 20:48