gpt4 book ai didi

子进程不打印任何内容

转载 作者:行者123 更新时间:2023-11-30 15:27:15 25 4
gpt4 key购买 nike

这是一个简单的 C 程序,用于将 URL(格式为 www.blabla.com/blabla/..)切割为主机部分和路径部分。我正在 fork 一个进程来完成这项工作,但 child 不会在屏幕上打印任何内容。这是代码。

#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 解析很弱,但这不是这里的问题。我不明白为什么子进程的代码不执行。如果我将 child 的代码(除了 sleep 和等待)更改为其他代码(简单如打印 hello world),一切都会正常。此外,解析 url 的代码工作正常,无需调用子进程来完成这项工作。

最佳答案

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

  1. 您在哪里为主机分配内存?没有它,它的行为是未定义的。
  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);
  • 保证 null 终止。
  • 可以使用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");
}

相同的输入/输出:

[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]$

关于子进程不打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com