LINUX.ORG.RU

Segmentation fault


0

0

Помогите плиз!!! Значит когда откоментирую 3 строки у меня прога вы-
подает в Segmentation fault. Зарание спасибо.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

inline char *Time();

int main()
{
    char *c;
    int i = 0,pid;
    int j = 1;
    
    if((pid = fork()) == 0)
    {
        while(1)
        {
            c = Time();
            printf("\t\t\t\t\t\t\tПотомок %s\n",c);
//          printf("\t\t\t\t\t\t%d\n",j);
        }
    
    
    
    } else {
    
        while(2)
        {
            c = Time();
            printf("Отец %s\n",c);
//          printf("%d\n",j);
//          j++;
        }
    
    }

exit(0);
}

inline char *Time()
{
    char *str;
    struct tm *tm_now;
    time_t timer;
    time(&timer);                 /* текущее календарное время */
    tm_now = localtime(&timer);   /* сделать структуру */
    strftime(str,6,"%M:%S",tm_now);
return str;
}
anonymous

Re: Segmentation fault

Она у тебя случайно не падает с закомментированными строками:

char *str;

...

strftime(str,6,"%M:%S",tm_now);

А кто будет место выделять для str?

Вставь типа str=malloc(7); перед strftime(str,6,"%M:%S",tm_now);

(только так не делают; надо по уму передавать буфер в Time())

Die-Hard ★★★★★ ()
Ответ на: Re: Segmentation fault от Die-Hard

Re: Segmentation fault

Да, с выделением памяти это было верно. >(только так не делают; надо по уму передавать буфер в Time()) а пример можно? Зарание спасибо.

anonymous ()
Ответ на: Re: Segmentation fault от anonymous

Re: Segmentation fault

>а пример можно?

Типа:

char *Time(char *str, size_t max)
{
    struct tm *tm_now;
    time_t timer;
    time(&timer);                 /* текущее календарное время */
    tm_now = localtime(&timer);   /* сделать структуру */
    strftime(str,max,"%M:%S",tm_now);
return str;
}


Вызов типа:

char c[7];
. . .
c[6]='\0';
printf("Отец %s\n",Time(c,6));

Die-Hard ★★★★★ ()
Ответ на: Re: Segmentation fault от anonymous

Re: Segmentation fault

Имеется созданный файл(до форка), родитель в него пишет данные. Вопрос: Почему потомок читает оттуда всякий мусор? Ведь копию файлового дескриптора потомок унаследовал от отца. Когда файл открываешь(в потомке), то все нормально.

anonymous ()
Ответ на: Re: Segmentation fault от anonymous

Re: Segmentation fault

>Имеется созданный файл(до форка), родитель в него пишет данные

Приведи пример программы...

mky ★★★★★ ()
Ответ на: Re: Segmentation fault от mky

Re: Segmentation fault

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

void dummy(int sig) {}
int Creat(const char *file_name,mode_t mode);
void Fchmod(int fd,mode_t mode);
inline char *Time(char *str, size_t max);
int Open(const char *name,int flags);

int main(int argc, char **argv)
{
    char str[30];
    char c[7];
    pid_t chield_pid[4];
    int i = 0,n;
    int fd1,fd2;
    
    if(signal(SIGUSR1,dummy) == SIG_ERR)
        { perror("can't set signal"); exit(1); }

    if(argc != 2) {fprintf(stdout,"use prog_name arg\n"); exit(0); }
    
    fd1 = Creat(argv[1],O_CREAT);
    Fchmod(fd1,S_IREAD|S_IWRITE);
    
    while(i < 4)
    {   
        if((chield_pid[i] = fork()) == -1)
            perror("can't creat fork()");
        
        if(chield_pid[i] == 0)
        {
            i = 1;
            while(1)
            {
                usleep(1000);
                lseek(fd2,0,SEEK_SET);//перемещаюсь в начало файла
                read(fd2,str,5);          //вот тут я читаю 5 байт 
                str[6] = '\0';
                printf("\t\t%s\n",str);   //и вывожу на экран
                i++;
            }
        }
        i++;
    }
    
    i = 1;
    while(1)
    {
        usleep(10);
        c[6]='\0';
        sprintf(str,"%d %d %s\n",i,getpid(),Time(c,6));
        n = strlen(str);
        write(fd1,str,n);
        fprintf(stdout,"%s",str);
        i++;
    }

exit(0);
}

int Creat(const char *file_name,mode_t mode)
{
    int fd;
    if((fd = creat(file_name,mode)) == -1)
        { perror("can't creat file"); exit(1); }

return fd;
}

int Open(const char *name,int flags)
{
    int fd;
    if((fd = open(name,flags)) == -1)
        { perror("can't open file"); exit(1); }
    return fd;
}

void Fchmod(int fd,mode_t mode)
{
    if((fchmod(fd,mode)) == -1)
        {perror("error chmod"); exit(1); }

}

inline char *Time(char *str, size_t max)
{
    struct tm *tm_now;
    time_t timer;
    time(&timer);                 /* текущее календарное время */
    tm_now = localtime(&timer);   /* заполнить структуру */
    str = malloc(5);
    strftime(str,max,"%M:%S",tm_now);
return str;
}

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.