在 Linux 中使用 fork() 函数创建进程

Posted

技术标签:

【中文标题】在 Linux 中使用 fork() 函数创建进程【英文标题】:Creating Processes in Linux using fork() Function 【发布时间】:2013-01-21 19:44:46 【问题描述】:

我一直在尝试编译一段C 代码,它应该使用fork() 函数创建进程。`

#include <stdio.h>
#include <unistd.h>
main()

    int n=15, z=20, count=3, mult=1;
    while(count<3)
    
        if(z!=0)
        
            z=fork();
            n=n+15;
        
        else
        
            z=fork(); n=n+10; mult=mult*n;
        
        printf(" z=%d   mult=%d",z,mult);
        count=count+1;
    

在终端中使用"gcc -Wall -W -Werror main.c -o ProcessCreateC" 编译。我收到错误:

main.c:3:5: error: return type defaults to ‘int’ [-Werror=return-type]
main.c: In function ‘main’:
main.c:20:5: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors

由于我只有在 Windows 中编译的经验,而对 Linux 的经验很少,我不知道是什么原因造成的。有什么想法吗??

【问题讨论】:

除了语言级别的错误,如果你初始化count = 3while(count&lt;3)循环将不会运行。 不要忘记在printf 格式字符串末尾的\n(甚至可能在每个fork 之前调用fflush(NULL);)。你应该测试fork的结果;它可能会失败! 【参考方案1】:

return 0; 或返回整数的类似表达式添加到main() 的末尾,并将main() 更改为int main(),我想你会发现代码运行良好。

当没有为 main() 指定返回类型时,它默认为 int。此外,使用您启用的编译器标志,不为 main() 指定类型会导致错误。

【讨论】:

谢谢。这确实是问题所在。这段代码是给我的,所以我认为问题在于我如何进行编译。应该寻找明显的。 Np - 我们都至少会遇到这种小错误。【参考方案2】:

问题是双重的(因为所有警告都是错误的):

    main 应该返回 int,例如实际上以return 0;结尾 您应该明确说明 main 返回 int,即写 int main(,而不仅仅是 main(

【讨论】:

【参考方案3】:

您没有提到 main 函数的返回类型为 void,因此 gcc 将其默认为整数返回值。

由于 GCC 遵循 ANSI C 标准,您必须将 main 的返回类型指定为 int,例如:

int main()

    //Do stuff
     return 0;

记住编译器使用的标准很重要,否则您将继续犯这些错误并花费更多时间进行调试而不是做一些富有成效的事情。

【讨论】:

谢谢@QuentinPerez 我只是想展示在 C 中正确编码的方法。:) 有人可能会争辩说,愿望将包括使用 -W -Wall -Werror... 但我离题了,因为我明白你的意思。 @Varagrawal:不确定你的意思。 main() 返回 void 不是正确的 C,无论错误标志如何。

以上是关于在 Linux 中使用 fork() 函数创建进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统编程(进程)——创建进程函数fork/vfork的使用

Linux系统编程(进程)——创建进程函数fork/vfork的使用

Linux系统编程(进程)——创建进程函数fork/vfork的使用

Linux系统编程(进程)——创建进程函数fork/vfork的使用

Linux系统编程-进程创建(fork)外部程序调用(exec)

Linux进程控制