2014-11-24 141 views
0

這是一個簡單的c程序,用於將url(形式爲www.blabla.com/blabla/..)切割爲主機部分和路徑部分。我是fork一個過程來完成這項工作,但孩子並沒有在屏幕上打印任何東西。這是代碼。子進程不打印任何東西

#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 

編輯:

然而,無論是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 2014-11-24 13:35:08

+1

@SSC有很多原因。大多數情況下它是不安全的,因爲如果提供的緩衝區長度和'n'值相同,那麼將不會有終止空字符'\ 0'來指示字符串結束。你可以檢查相同的[這裏](http://linux.die.net/man/3/strncpy)。 – 2014-11-24 13:36:32

+0

我明白你的觀點。謝謝回覆。 – SSC 2014-11-24 13:40:16