首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux中wait()用法

wait() 是 Linux 系统中的一个系统调用,主要用于父进程等待其子进程的结束。这个调用会暂停当前进程的执行,直到其子进程之一退出,或者接收到指定的信号为止。

基础概念

wait() 函数定义在 <sys/wait.h> 头文件中,它的原型如下:

代码语言:txt
复制
pid_t wait(int *status);
  • status 是一个指向整数的指针,用于存储子进程的退出状态。
  • 函数返回值是结束的子进程的进程 ID(PID),如果有多个子进程同时结束,返回其中任意一个的 PID。

优势

  1. 资源回收:父进程可以通过 wait() 系统调用回收子进程的资源,避免产生僵尸进程。
  2. 同步控制:父进程可以等待子进程完成特定任务后再继续执行,实现进程间的同步。

类型

wait() 有几种变体,包括 wait(), waitpid(), 和 wait3()/wait4()

  • wait():等待任意一个子进程结束。
  • waitpid(pid_t pid, int *status, int options):可以指定等待特定的子进程,或者设置等待选项。
  • wait3()wait4():除了状态和 PID,还可以获取子进程的资源使用情况。

应用场景

  • 进程同步:确保父进程在子进程完成前不会继续执行。
  • 资源管理:及时回收子进程的资源,防止内存泄漏。
  • 错误处理:检查子进程的退出状态,以便进行错误处理或日志记录。

示例代码

以下是一个简单的 wait() 使用示例:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t child_pid;

    // 创建子进程
    child_pid = fork();

    if (child_pid == 0) { // 子进程
        printf("Child process: PID = %d\n", getpid());
        exit(0); // 子进程退出
    } else if (child_pid > 0) { // 父进程
        int status;
        wait(&status); // 等待子进程结束
        printf("Parent process: Child with PID %d has finished.\n", child_pid);
        if (WIFEXITED(status)) {
            printf("Child process exited with status %d\n", WEXITSTATUS(status));
        }
    } else { // fork失败
        perror("fork");
        exit(EXIT_FAILURE);
    }

    return 0;
}

遇到的问题及解决方法

问题:调用 wait() 后,父进程一直阻塞,没有返回。

原因

  • 可能没有子进程可供等待。
  • 子进程可能已经结束,但父进程未能及时调用 wait()

解决方法

  • 确保在调用 wait() 前已经成功创建了子进程。
  • 使用 waitpid() 并设置 WNOHANG 选项,这样如果没有子进程退出,waitpid() 会立即返回而不是阻塞。
代码语言:txt
复制
pid_t result = waitpid(-1, &status, WNOHANG);
if (result == 0) {
    // 没有子进程退出
} else if (result < 0) {
    // 错误处理
}

通过以上方法,可以有效地管理和同步父子进程,同时避免僵尸进程的产生。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java Wait错误用法

Java Wait 错误用法 实例观察 先来看看一段代码: new Thread(() -> { synchronized (ReleaseLockDemo.class) {...它为什么会在1号线程等待的时候,2号线程运行了呢,它不应该是要等待1号线线程中的锁释放了才能运行的吗?又为什么会报两个错呢?...可是在前面的1号线程只运行到了一半就直接运行2号线程了,中间只做了一个wait操作,难道wait操作会引发锁的释放吗?...monitor的重要特点是,同一时刻,只有一个进程/线程能进入monitor中定义的临界区,这使得monitor能够达到互斥的效果。...()方法必须要用拥有该对象monitor的线程才可以正常调用,而我们的代码中synchronzed所锁住的对象是ReleaseLockDemo.class。

1.2K10
  • Linux中Sleep和Wait命令的使用方式

    它通常用于脚本中,但也适用于命令行。在下面的示例中, sleep 在两个 date 命令之间暂停30秒。...但也可以通过在参数中添加一个字符来让它休眠不同的时间: 10s = 10 seconds 1m = 1 minute 2h = 2 hours 3d = 3 days [root@localhost ~...[root@localhost ~]# while true ; do free -h ; sleep 5 ; done Wait命令 wait 命令在等待后台进程完成后捕获后台进程的退出状态。...如果使用 wait -n(不需要额外的参数),wait 将等待任何后台任务完成。在下面的示例中, sleep 6 命令首先完成,脚本结束,但其他两个 sleep 进程将继续在后台运行几秒钟。 #!...注意:等待的进程必须是“子进程”(在当前 shell 中启动的进程)。 总结 两者都可以在脚本或命令行中使用。但是,wait 命令仅适用于在后台运行的进程。

    2.7K40

    Linux中Sleep和Wait命令的使用方式

    它通常用于脚本中,但也适用于命令行。在下面的示例中, sleep 在两个 date 命令之间暂停30秒。...但也可以通过在参数中添加一个字符来让它休眠不同的时间: 10s = 10 seconds 1m = 1 minute 2h = 2 hours 3d = 3 days [root@localhost ~...[root@localhost ~]# while true ; do free -h ; sleep 5 ; done Wait命令 wait 命令在等待后台进程完成后捕获后台进程的退出状态。...如果使用 wait -n(不需要额外的参数),wait 将等待任何后台任务完成。在下面的示例中, sleep 6 命令首先完成,脚本结束,但其他两个 sleep 进程将继续在后台运行几秒钟。 #!...注意:等待的进程必须是“子进程”(在当前 shell 中启动的进程)。 总结 两者都可以在脚本或命令行中使用。但是,wait 命令仅适用于在后台运行的进程。

    2.6K20

    Linux中符号的用法

    1.“;”分号用法 方式:command1 ; command2 用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。....“|”管道符用法 方式:command1 | command2 上一条命令的输出,作为下一条命令的参数传入 3.“&”符号用法 方式:command1 & &放在启动参数后面表示设置此进程为后台进程...4.“&&”符号用法 逻辑与的功能 方式:command1 && command2 [&& command3 ...] shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量...中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。...5.“||”符号用法 逻辑或的功能 方式:command1 || command2 [|| command3 ...] 只有在 || 左边的命令返回假(命令返回值 $?

    3.4K20

    Linux中ln的用法

    ln是linux中一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录...文件系统链接 基本语法 ln的用法跟cp和mv相似: ln -s 注意 -s标志指定软链接。如果省略此标志,则默认情况下会创建硬链接。 您可以为文件和目录创建符号链接。...但是,符号链接的权限是从它们的源继承的,所以如果不使用sudo,您就不能在这个目录中写入或删除文件。...但您希望许多用户能够在/home/目录中访问此目录,则可以在/home/目录中创建指向的多个符号链接至/srv/www/example.com/public_html/。...如果您希望将Web服务器配置文件保留在版本控制中,以便可以在项目和服务器之间轻松更新和共享它们,则可以将文件保存在主目录中的Git存储库中,并为NGINX或Apache配置创建符号链接目录: mkdir

    3.4K60

    Linux--fork与wait

    fork与exec 在Linux中,都是通过fork与vfork系统调用来创建子进程,并且在fork完之后,通常会调用exec命令簇来替换代码段,执行不同的任务。...该原因都在sys/wait.h头文件中定义: 宏 说明 WIFEXITED 如果子进程正常结束,它就返回真;否则返回假。...options); 从参数中可以看到,可以指定wait操作的pid,以及options。...如果对于子进程的状态改变不是很关心的话,也可以注册SIGCHILD信号,当子进程状态改变时候,内核会发送该信号给父进程,让父进程接收子进程状态,可以在该信号处理函数中调用wait()来接收子进程状态,并且让子进程可以安心改变状态...等待子进程都结束 如果需要等待子进程都结束,则需要在fork完子进程后,为每个创建的子进程调用waitpid来等待所有子进程都结束 Android中的fork与wait Android中Runtime.getRuntime

    2.6K30

    Linux wait() 和 waitpid()函数介绍

    如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是如果在任意时刻调用wait则进程可能会阻塞。...由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习一下其中最常用的两个: 1,WIFEXITED(status...并将该子进程的终止状态存放在有status指向的存储单元中。 Waitpid 函数提供了wait函数没有提供的三个功能。 Waitpid可等待一个特定的进程,而wait则返回任一个终止子进程的状态。...Waitpid返回值和错误 waitpid的返回值比wait稍微复杂一些,一共有3种情况: 当正常返回的时候,waitpid返回收集到的子进程的进程ID; 如果设置了选项WNOHANG,而调用中waitpid...从结果中,我们看到父进程一直在等待子进程的结束。

    2.4K50

    Linux 命令(252)—— wait 命令(builtin)

    文章目录 1.命令简介 2.命令格式 3.选项说明 4.返回值 5.常用示例 参考文献 1.命令简介 wait 等待每个指定的进程并返回其终止状态。...该指令常用于 Shell 脚本编程中,待指定的指令执行完成后,才会继续执行后面的任务。等待作业时,在作业号前须添加百分号"%"。 2.命令格式 wait [n ...]...每个 n 可以是进程 ID 或作业号;如果给定了作业号,则等待该作业管道中的所有进程。如果未给定 n,则等待所有当前活动的子进程,返回状态为零。 3.选项说明 无。...sleep 10 & [1] 2875 wait 2875 [1]+ Done sleep 10 (2)等待指定作业完成。...sleep 10 & [1] 3171 wait %1 [1]+ Done sleep 10 输出当前存在作业号使用 jobs 命令。

    1.1K20

    Linux小课堂之Wait命令

    wait是一个shell命令,它等待给定进程完成,然后返回其退出状态。 Wait命令用于等待特定的进程ID和作业ID并返回其终止状态。...-wait PID(PID-实用程序要等待终止的命令的进程ID)。-wait JID(JID-作业ID,标识要等待的后台进程,仅适用于当前Shell执行环境中的wait调用)。...如果wait命令检测到任何错误,那么它将返回1到126之间的任何值。如果最后一个进程ID是未知的,则wait命令将以值127退出。...Wait命令示例 让我们检查一些脚本以了解wait命令的工作方式。 示例1 –带有Wait命令的脚本 我们有两个脚本,分别称为“ foo.sh”和“ bar.sh”脚本。...结论 Wait和Sleep都是操作系统中基于时间的系统调用。 我们来看一下wait和sleep命令之间的区别。 ?

    2.4K20

    linux中getchar函数用法,linux getchar函数使用

    1 函数介绍 1) 函数原型 int getchar(void); 2) 函数功能 从stdin中读取一个字符。 3) 返回值 返回读取字符的ASCII值或者EOF字符或者出错值。...4) 头文件 #include 2 函数使用 2.1 getchar函数的特点 Linux下编写的一个例子: #include int main(void) { char ch; int num...] //提示:当程序运行到while循环中的getchar时,界面等待用户输入字符,直到回车出现 input your strings: 输入字符串:hello getchar 在输入这段字符串的过程中getchar...2) getchar每次只读取一个字符,如果程序中不采用循环而只设置一个getchar()语句,则getchar只读取输入字符串的首个字符,其余字符依然留在缓存区中(若将程序的while循环去掉只输出第一个字符...重新编译并运行程序,输入字符串:hello[回车] 得第一次运行结果 当程序首次执行到while中的getchar时,getchar函数等待用户的输入,getchar函数一直等待用户输入,当用户按下回车表示用户输入完毕

    3.2K30
    领券