子进程不会打印任何内容

时间:2014-11-24 13:25:47

标签: c string url fork wait

这是一个简单的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 个答案:

答案 0 :(得分:1)

我在你的代码中发现了两个问题。

  1. 你在哪里为host分配内存?没有它,它的未定义行为。
  2. strncpy()非常不可靠。优先使用strcpy()
  3. 更改代码以在复制前分配内存。

    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:

    [sourav@broadsword temp]$ ./a.out 
    Give me a url.
    www.blabla.com/blabla/abc/def
    path : /blabla/abc/def 
    host : www.blabla.com
    Bye!
    [sourav@broadsword temp]$