【问题标题】:Error when using wait() and fork() in c++在 C++ 中使用 wait() 和 fork() 时出错
【发布时间】:2013-04-17 09:42:13
【问题描述】:

我正在尝试在我的 c++ 代码中使用 wait()fork()。但我在编译阶段收到以下错误

../test/my_test.cpp: In member function 'void MYClass::myMethod()':
../test/my_test.cpp:98: error: no matching function for call to 'wait::wait(int*)'
/data/backfire/staging_dir/toolchain-i386_gcc-4.1.2_uClibc-0.9.30.1/lib/gcc/i486-openwrt-linux-uclibc/4.1.2/../../../../i486-openwrt-linux-uclibc/sys-include/bits/waitstatus.h:68: note: candidates are: wait::wait()
/data/backfire/staging_dir/toolchain-i386_gcc-4.1.2_uClibc-0.9.30.1/lib/gcc/i486-openwrt-linux-uclibc/4.1.2/../../../../i486-openwrt-linux-uclibc/sys-include/bits/waitstatus.h:68: note:                 wait::wait(const wait&)

代码:

void MYClass::myMethod()
{
    pid_t pid;
    int status;
    if ((pid = fork()) < 0) {
       printf("error fork\n");
       return;
    }
    if (pid == 0) {
        /* cild*/
        ......
    }
    /*parent*/
    while (wait(&status) != pid);
}

如何修复错误?

【问题讨论】:

    标签: c++ c fork wait


    【解决方案1】:

    错误表明它试图创建一个名为 wait 的类型的对象,从指针转换,而不是(如预期的那样)试图调用一个名为 wait 的函数。

    问题是您没有包含声明wait 函数的标头。但是,在另一个头文件中定义了一个名为 wait 的类型,因此,如果没有函数声明,编译器会假定您是这个意思。

    解决方案,来自wait(2) 的手册页:

    #include <sys/types.h>
    #include <sys/wait.h>
    

    【讨论】:

    • 我正在使用 c++ 库,我检查了这个库的源代码,没错,我发现它在其中一个类中定义了 wait() 方法。如何避免这个问题?我无法修改共享库
    • @MOHAMED:正如我在答案中所建议的那样,如果您在代码中使用 ::wait 而不是 wait 是否有效?如果不是,那么您的库必须在全局命名空间中转储名称,唯一明智的解决方案是将其丢弃并使用不那么邪恶的东西。
    • 使用 ::wait 并不能避免问题。使用extern "c" { wait() } 能解决问题吗?
    • @MOHAMED:实际上,我认为只要声明了函数,您的代码就应该可以工作。您是否包含正确的标题,&lt;sys/types.h&gt;&lt;sys/wait.h&gt;
    • 当我添加 &lt;sys/wait.h&gt; 时它可以工作。谢谢你的回答
    【解决方案2】:

    看起来需要一个构造函数...试试

     while (::wait(&status) != pid);
    

    使用作用域运算符调用wait-函数。 如果这没有帮助,您有一个名称冲突,需要为您的类创建一个不同的命名空间。

    namespace mywait{
    
      class MyClass {
    
      };
    
    }
    

    【讨论】:

      【解决方案3】:

      同意“bash.d”。 如果您自己编写了“waitstatus.h”并且想要使用它,则需要将其包装在命名空间中。

      如果没有,您可能想尝试包含 sys/wait.h 而不是 waitstatus.h

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-30
        • 2015-11-08
        • 2014-04-21
        • 2012-01-03
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        相关资源
        最近更新 更多