【问题标题】:C: forking new process failsC: fork 新进程失败
【发布时间】:2013-07-10 04:43:10
【问题描述】:

以下代码中的fork不起作用!它永远不会进入运行功能。你能告诉我这里有什么问题吗?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void run(char* a)
{
    char* k=a;
    int i;
    for(i=0;i<3;i++)
      k[i]='s';
    printf("hi");
    return;
}
int main()
{   
    char* a="cbd";
    pid_t j;
    j=fork();
    printf("%d\t",j);
    int y;
    if(j==0)
      run(a);
    int i;
    for(i=0;i<3;i++)
      printf("%c\t",a[i]);
 return 0;
}

输出是

24180  c b d

【问题讨论】:

  • 我会使用stderr 进行错误检查。像这样:if (j &lt; 0) perror ("couldn't fork")
  • j 的值不是负数。我已经检查过了。
  • 然后给我们你的程序的输出

标签: c linux fork


【解决方案1】:

实际上调用了run()函数。但是k[i]='s'; 声明的问题。 "cbd" 是字符串文字并且是只读的。

在本地为字符串分配内存并传递地址。

就像@Andy 提到的,子进程崩溃了。

【讨论】:

  • 不,因为“hi”没有打印出来
  • 只需将 printf() 放在 for 循环之前。
  • Arrgh... 当你击败我时,我只是在输入我的答案。这是对的。 "hi" 不打印,因为 子进程崩溃 试图分配给 k[0]。
  • char *更改为char a[]
  • @smo 参考这个stackoverflow.com/questions/17111140/… 给你一些想法。
【解决方案2】:

对于fork(),没有问题。这是你的 run() 函数。 k 是指向 const 字符串的指针,因此 k[0]='s' 倾向于报告访问冲突。

【讨论】:

    【解决方案3】:

    问题在于k[i] = 's',它导致进程因总线错误而崩溃。原因是,您正在尝试编辑放置在目标文件 RODATA 部分中的字符串文字“cbd”,该文件存储在只读内存中。如果将 main 的第一行更改为char a[3] = {'c', 'b', 'd'};,您的程序将按预期运行。

    【讨论】:

    • 我不建议添加任何目标文件术语,这会让仍在学习基础知识的 OP 对您的回答感到困惑C
    猜你喜欢
    • 2011-10-06
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多