这是一个简单的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的代码工作正常,而不需要让孩子完成这项工作。
答案 0 :(得分:1)
我在你的代码中发现了两个问题。
host
分配内存?没有它,它的未定义行为。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:
[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]$