#c #linux
#c #linux
Вопрос:
Я не понимаю, почему я получаю ошибку segfault, я не использовал никаких указателей. То, что я пытаюсь сделать, это отправлять сообщения между родительским и дочерним процессами с использованием двух каналов, для этого я сначала разветвляю, затем закрываю / открываю требуемые разделы канала и использую make_message для создания сообщения, которое я хочу отправить. Проблема может заключаться в том, что я сначала пишу с дочерним процессом и читаю с родительским процессом.
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#define READ_END 0
#define WRITE_END 1
#define BUF_SIZE 256
void make_message (int num, char *message){
char buftime[26];
time_t timer;
struct tm* tm_info;
time (amp;timer);
tm_info = localtime (amp;timer);
strftime (buftime, 26, "%Y-%m-%d %H:%M:%S", tm_info);
sprintf (message, "%s %d at %sn", "Hello I'm child number", num, buftime);
}
это функция make_message
int main (int agrc, char *argv[]){
int p1[2];
int p2[2];
char *virtualaddr;
if (pipe(p1) == -1){
fprintf (stderr, "pipe failed");
return 1;
}
if (pipe(p2) == -1){
fprintf (stderr, "pipe failed");
return 1;
}
close (p1[READ_END]);
close (p2[WRITE_END]);
close (p2[READ_END]);
close (p1[WRITE_END]);
switch(fork()){
case -1:
fprintf (stderr, "fork error");
return 1;
case 0: //pere mais (fils 1)
{
char buf[BUF_SIZE];
do{
char message[BUF_SIZE];
//memset (message, 0, BUF_SIZE);
/*-------------WRITE 1--------------*/
close (p1[READ_END]); //ferme la partie non utilisé du pipe
close (p2[WRITE_END]); //ferme la partie non utilisé du pipe
printf ("1");
make_message (1, message);
strcpy (virtualaddr, message);
//ecrit au pipe
write (p1[WRITE_END], virtualaddr, BUF_SIZE);
//ferme le write du pipe
close (p1[WRITE_END]);
/*-------------WRITE 1--------------*/
sleep(1);
/*-------------READ 4---------------*/
read (p2[READ_END], buf, BUF_SIZE); //fils lit
printf ("Message received by child 1 : %sn", buf);
fflush( stdout);
//ferme read dans le pipe
close (p2[READ_END]);
/*-------------READ 4---------------*/
}while(1);
_exit(0);
}break;
default: { //fils 2
char buf[BUF_SIZE];
//char message[BUF_SIZE];
do{
char message[BUF_SIZE];
//memset (message, 0, BUF_SIZE);
/*-------------READ 2---------------*/
close (p2[READ_END]);
close (p1[WRITE_END]); //ferme partie non utilisé du pipe
printf("2");
read (p1[READ_END], buf, BUF_SIZE); //fils lit
printf ("Message received by child 2 : %sn", buf);
fflush( stdout);
//ferme read dans le pipe
close (p1[READ_END]);
/*-------------READ 2---------------*/
/*-------------WRITE 3--------------*/
make_message (2, message);
strcpy (virtualaddr, message);
//ecrit au pipe
write (p2[WRITE_END], virtualaddr, BUF_SIZE);
//printf ("%s", buf);
fflush( stdout);
//ferme le write du pipe
close (p2[WRITE_END]);
/*-------------WRITE 3--------------*/
memset (buf, 0, sizeof(buf));
sleep(1);
}while(1);
_exit(0);
}
break;
}
}
Комментарии:
1. Следующая проблема: вы закрыли все концы канала.
Ответ №1:
Я не использовал никаких указателей.
Да, у вас есть:
char *virtualaddr;
И он никогда не инициализируется перед выполнением
strcpy (virtualaddr, message);
Скомпилируйте с -Wall -O
помощью, и я уверен, вы получите предупреждение об этом.