2014-11-24 3 views
0

Это простая программа для резки url (формы www.blabla.com/blabla/..) в часть хоста и часть пути. Я новичок в процессе выполнения задания, но ребенок не печатает enything на экране. Вот код.Детский процесс ничего не печатает

#include<stdio.h> 
#include<string.h> 
#include<sys/types.h> 
#include<sys/wait.h> 
#include<stdlib.h> 
#include<errno.h> 
#include<unistd.h> 

main() 
{ 
    pid_t pid; 
    char url[300]; 
    char* path; 
    char* host; 
    int n,status; 

    printf("Give me a url.\n"); 
    scanf("%s",url); 

    pid=fork(); 
    if (pid==0) 
    { 
     path=strchr(url, '/'); 
     n=strlen(url)-strlen(path); 
     strncpy(host,url,n); 
     printf("path : %s \nhost : %s\n", path,host); 
     sleep(3); 
     exit(status); 

    } 
    else 
    { 
     wait(&status); 
    } 
    printf("Bye!\n"); 
} 

Я знаю, что синтаксический анализ URL слабый, но это не проблема. Я не понимаю, почему код дочернего процесса не выполняется. Если я изменяю код ребенка (кроме сна и ожидания) во что-то другое (простое, как печать привет мир), все работает. Кроме того, код для синтаксического анализа URL работает отлично, не называя ребенка выполнять работу.

ответ

1

Я вижу два вопроса в вашем коде.

  1. Где вы разместили память для host? без этого, его неопределенное поведение.
  2. strncpy() очень ненадежно. предпочтительным является использование strcpy().

Измените свой код, чтобы выделить память перед копированием.

path=strchr(url, '/'); 
n=strlen(url)-strlen(path); 
host = calloc (n, sizeof (char)); //memory allocation 
strcpy(host,url);     //use strcpy 

EDIT:

Однако ни strcpy() не strncpy() не является полностью безопасным. Чтобы быть на более безопасной стороне, я предпочитаю использовать strcat() для достижения того же.

host[0] = '\0'; 
strncat(host, url, n); 
  • нулевое прекращение гарантировано.
  • может управлять длиной, подлежащей копированию, с использованием n.

Пожалуйста, проверьте код ниже

#include<stdio.h> 
#include<string.h> 
#include<sys/types.h> 
#include<sys/wait.h> 
#include<stdlib.h> 
#include<errno.h> 
#include<unistd.h> 

main() 
{ 
    pid_t pid; 
    char url[300]; 
    char* path; 
    char* host; 
    int n,status; 

    printf("Give me a url.\n"); 
    scanf("%s",url); 

    pid=fork(); 
    if (pid==0) 
    { 
     path=strchr(url, '/'); 
     n=strlen(url)-strlen(path); 
     host = calloc (n, sizeof (char));  
     host[0] = '\0'; 
     strncat(host, url, n); 
     printf("path : %s \nhost : %s\n", path,host); 
     sleep(3); 
     exit(status); 

    } 
    else 
    { 
     wait(&status); 
    } 
    printf("Bye!\n"); 
} 

Samele I/O:

[[email protected] temp]$ ./a.out 
Give me a url. 
www.blabla.com/blabla/abc/def 
path : /blabla/abc/def 
host : www.blabla.com 
Bye! 
[[email protected] temp]$ 
+0

почему 'strncpy' ненадежны? Разве это не безопаснее, чем 'strcpy'? – SSC

+1

@SSC есть много причин. в основном это небезопасно, потому что, если длина предоставленного буфера и значение «n» одинаковы, то для обозначения конца строки не будет завершающий нуль '\ 0'. вы можете проверить то же [здесь] (http://linux.die.net/man/3/strncpy). –

+0

Я вижу вашу точку зрения. Спасибо за ответ. – SSC

Смежные вопросы