waitpid最后以一个参数设为0_waitpid

waitpid最后以一个参数设为0_waitpid营销树今天精心准备的是 waitpid 下面是详解 linux 中的 waitpid 函数的返回值问题 TheprocessID orzeroifWNOH or 1onerror inwhichcasee 者是 man 中的解释 我不明白在什

营销树今天精心准备的是《waitpid》,下面是详解!

linux 中的waitpid函数的返回值问题

TheprocessIDofthechildwhichexited,orzeroifWNOHANGwasusedandnochildwasavailable,or-1onerror(inwhichcaseerrnoissettoanappropriatevalue).者是man中的解释,我不明白在什么情况下…

The process ID of the child which exited, or zero if WNOHANG was used

and no child was available, or -1 on error (in which case errno is set

to an appropriate value).

者是man 中的解释,我不明白在什么情况下会返回0,为什么返回0,最好给举个例子,巨大的感谢了

展开

-1 是出现错误的返回值,我就不说了。

0 只有当你的 waitpid 第三个参数包含 WNOHANG 的时候才有可能。

比如

pid = fork();

if (pid == 0) {

//child process

while(1) {

printf(“aaa\n”);

sleep(1);

}

} else {

// parent

option = 0;

result = waitpid(pid, NULL, option);

。。。。。

}

上面的代码,由于子进程永远不会结束(除非它被kill),父进程会一直停在 waitpid 那个系统调用,等待子进程结束 (当子进程结束后, waitpid 的返回值等于子进程 pid)。

但是如果 option=WNOHANG; 父进程不会停在 waitpid 那里, waitpid 会立刻返回 0 ,表示被等待的子进程并没有结束。

linux里面的wait和waitpid是什么?

wait和waitpid的不同在于wait会令调用者阻塞直至某个子进程终止而waitpid则可以通过设置一个选项来设置为非阻塞,另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。

waitpid提供了wait所没有的三个特性:

1 waitpid使我们可以等待指定的进程

2 waitpid提供了一个无阻塞的wait

3 waitpid支持工作控制

具体可以查看APUE page202

求助,SIGCHLD和waitpid的关系

其实这两者之间没有必然的关系。

SIGCHILD只是在子进程退出的时候发送给父进程的一个信号值,这是一种异步通知父进程的方式.父进程可以捕获,忽略这个信号,忽略这个信号也是避免僵尸进程的一种方式.

waitpid or wait回收子进程的结束状态,避免子进程进入僵尸状态.

主进程可以直接调用waitpid or wait来回收子进程的结束状态,不一定非得通过SIGCHILD信号处理函数,也就是说waitpid or wait不是依靠SIGCHLD信号是否到达来判断子进程是否结束.但是如果主进程除了回收子进程状态以外还有其他的业务需要处理那么最好是通过SIGCHILD信号处理函数来调用waitpid or wait,因为这是异步的操作.

如果注册了SIGCHLD信号处理函数,那么就需要等待SIGCHLD信号的到达并且完成信号处理函数,waitpid or wait才能接受到子进程的的退出状态.

前面的3点可能很多同学都知道,但是对第4点可能没有关注过,其实以前我也没有关注过第4点,某天man system的时候看到”During execution of the command, SIGCHLD will be blocked”,觉得有点不解.”为什么要阻塞SIGCHLD信号呢?是不是跟waitpid有关呢?”

在system实现中会调用waitpid来回收子进程的状态,首先想到的一点是:阻塞SIGCHLD是为了避免主进程已经注册的SIGCHLD处理函数回收所有的子进程状态,那么在system中的waitpid调用会导致ECHILD(No child processes)的错误.为了证实自己的想法是否正确在网上查了一下,最后发现还跟第4点有关系,因为如果不阻塞SIGCHLD信号并且主进程注册了SIGCHLD信号处理函数,那么就需要等主进程的信号处理函数返回waitpid才能接受到子进程的退出状态,也就是如果信号处理函数需要1min才能处理完那么system也需要1min才能返回.所以在调用system函数的时候阻塞SIGCHLD,这样在执行期间信号被阻塞就不会调用信号处理函数了,system中的waitpid就能”及时”的获取到子进程的状态,然后”及时”退出.

wait和waitpid的区别

wait    英[weɪt]    美[wet]

vt.    等待; 等候; (尤指长期地) 希望; 盼望;

vi.    准备妥; 在手边; 可得到; 可使用;

vt.    推迟,搁置,延缓;

[例句]I walk to a street corner and wait for the school bus

我走到街角等校车。

[其他]    第三人称单数:waits 现在分词:waiting 过去式:waited过去分词:waited

waitpid 会暂时停止目前进程的执行,直到有信号来到或子进程结束。

关于waitpid函数的问题,为什么最后子进程没退出来

WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。 raise(SIGSTOP);只不过是让子进程暂停,并没有结束进程。所以返回值为0 还有ret=kill(result,SIGKILL)==0这句实际是这么执行的ret=(kill(r

OS.WNOHANG 是什么意思?

在交互式下执行os.WNOHANG结果是1….

在交互式下执行 os.WNOHANG 结果是1.

那是一个os模块的常量,一般在os.waitpid(-1 , os.WNOHANG)里面用

-1 表示等待所有的子进程结束,作用相当于调用wait ,WNOHANG表示不使父进程挂起,而立即返回

C语言问题 关于implicit declaration of function

我在被调用函数所在文件如1.c的头文件1.h申明了这个函数,在调用函数的文件也包含了被调用文件的1.h但是为什么还会出现implicitdeclarationoffunction隐式申明函数的警告呢…

我在被调用函数所在文件如1.c的头文件1.h申明了这个函数,在调用函数的文件也包含了被调用文件的1.h 但是为什么还会出现 implicit declaration of function 隐式申明函数的警告呢

有两种情况会产生这种警告

1 没有把函数所在的c文件生成.o目标文件

2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明

在linux系统下实现对system() 函数对fork() ,exec(…

不知道你这实现这些函数的调用是什么意思,是要重写这些接口吗?还是举个例子说明?

我解释一下吧:

(1)system()其实就是对fork()和exec()函数族等的封装。

(2)fork()是用来产生子进程的,是现在我知道的唯一一个返回两个值的函数(有过有另外的,麻烦网友指出),返回-1表示执行失败;否则返回大于0的值时,表示是子进程的进程号,返回0时,表示父进程创建子进程成功。

(3)exec()不是一个函数,是函数族,有execl(),execv(),execle(),execve(),execlp(),execvp(),它们常用于子进程中“脱胎换骨”,就是父进程创建子进程后,子进程几乎是父进程的拷贝(只有很少的东西不一样,如进程号(PID)等),然后子进程调用exec()函数族执行其他的程序,即将原来进程的东西全部清除掉,称为一个崭新的进程,所以叫“脱胎换骨”。

(4)waitpid()是用在父进程中等待进程退出的,如果父进程不调用这个接口,那么它有可能先于子进程退出,那么子进程就会称为孤儿进程,继而被init进程(PID为1的进程,Linux启动后第一个启动的进程)收养。或者父进程并未退出,也未调用这个接口,但是子进程已经执行完成,那么子进程就会成为一个僵尸进程。

具体例子在网上找找吧,都不是很难。

进程间通信中wait函数有什么作用

调用wait或waitpid有三种不同的情况发生:

1、如果其所有子进程都还在运行,则阻塞

2、如果一个子进程终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回

3、如果它没有任何子进程,则立即出错返回

如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回,但是如果在任意时刻调用wait,则进程可能会阻塞。

在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。

waitpid并不等待在其调用之后的第一个终止子进程,他有若干选项,可以控制他所等待的进程。

waitpid函数提供wait函数没有提供的三个功能:

1、waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态

2、waitpid提供了一个wait的非阻塞版本

3、waitpid支持作业控制

waitpid

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199411.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午1:02
下一篇 2026年3月20日 下午1:03


相关推荐

  • iocomp控件与iocomp控件使用教程[通俗易懂]

    iocomp控件与iocomp控件使用教程[通俗易懂]WelcometotheIocompPlotPackManual.Thismanual,inadditiontoourhelpfilesandexamplesourcecodeprojects,providesafullsuiteofdocumentationforunderstandinghowourPlotPackcomponentsareconstructed,operate,andareusedtoenhancethe

    2022年7月17日
    25
  • 汉字对应的ASCLL

    汉字对应的ASCLLprintf c c c c 206 196 208 249 输出的是文 轩 include lt stdio h gt include lt string h gt structAscll charstr 50 inta b sss 20000 一个结构存一个字 intmain int

    2026年3月26日
    3
  • Qt学习之路之QMovie动画「建议收藏」

    Qt学习之路之QMovie动画「建议收藏」QMovie类是一个很方便的类,用于播放动画。在刷新页面的时候,可以尝试用QMovie来实现等待界面。QMovie类用于显示简单的动画,没有声音。首先,通过将一个文件的名称或者一个指针传递给QMovie的构造函数构建一个QMovie对象。传递的文件包含文件的格式。可以调用函数isValid()来检测在动画开始播放前,动画是否有效。调用函数start()函数开始播放动

    2022年6月15日
    37
  • Android angle_android 界面悬停

    Android angle_android 界面悬停最近在研究android游戏引擎Angle,准备纪录下学习心得。我的目的是用它实现UI,给我开发的安卓应用添加一些迷人的效果。初步研究了一下,只要解决下列问题就可以了:1•汉字显示 2•动态更新纹理,比如从网络下载图片,更新显示 3•简单的动画效果 4•与播放器整合 5•实现一些基本控件,如List(文本、图片),Button,Tab,TextView等 6•与非openg

    2026年1月23日
    5
  • js 后退刷新[通俗易懂]

    js 后退刷新[通俗易懂]history.back()和history.go(-1)都可以实现返回上一页并不刷新向要页面后退刷新使用:window.location.href=document.referrer;即可实现

    2022年7月25日
    9
  • veriloghdl与vhdl_verilog基本语法

    veriloghdl与vhdl_verilog基本语法 硬件描述语言HDL(HardwareDescribeLanguage)     HDL概述     随着EDA技术的发展,使用硬件语言设计PLD/FPGA成为一种趋势。目前最主要的硬件描述语言是VHDL和VerilogHDL。VHDL发展的显纾锓ㄑ细瘢鳹erilogHDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。VHDL和VerilogHDL两者相比

    2026年2月8日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号