我们从Python开源项目中,提取了以下17个代码示例,用于说明如何使用os.WIFSTOPPED。
def wait_child(pid): while True: try: # wait for child process wpid, sts = os.waitpid(pid, 0) except KeyboardInterrupt: # handle exceptions when parent is waiting handle_parent_exit(pid) # if child process stopped if os.WIFSTOPPED(sts): continue # if receive keybord interuption or kill signal elif os.WIFSIGNALED(sts): return sts # seems not work elif os.WIFEXITED(sts): return sts else: raise "Not stopped, signaled or exited???"
def platformProcessEvent(self, event): pid, status = event if os.WIFEXITED(status): tid = self.getMeta("ThreadId", -1) exitcode = os.WEXITSTATUS(status) if tid != self.getPid(): # Set the selected thread ID to the pid cause # the old one's invalid if tid in self.pthreads: self.pthreads.remove(tid) self.setMeta("ThreadId", self.getPid()) self._fireExitThread(tid, exitcode) else: self._fireExit(exitcode) elif os.WIFSIGNALED(status): self._fireExit(os.WTERMSIG(status)) elif os.WIFSTOPPED(status): sig = os.WSTOPSIG(status) self.handlePosixSignal(sig) else: print("OMG WTF JUST HAPPENED??!?11/!?1?>!")
def wait(self): '''This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(), but, the child is technically still alive until its output is read by the parent. ''' if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: return self.exitstatus self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED(status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED(status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED(status): # pragma: no cover # You can't call wait() on a child process in the stopped state. raise PtyProcessError('Called wait() on a stopped child ' + 'process. This is not supported. Is some other ' + 'process attempting job control with our child pid?') return self.exitstatus
def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read. """ if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: raise ExceptionPexpect ('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED (status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED (status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED (status): raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') return self.exitstatus
def platformProcessEvent(self, event): pid,status = event if os.WIFEXITED(status): exitcode = os.WEXITSTATUS(status) tid = self.getMeta("ThreadId", None) if tid == None or len(self.getThreads()) == 0: self._fireExit( exitcode ) return self._fireExitThread(tid, exitcode) # set thread to pid ( the thread exited... so... ) self.setMeta('ThreadId', pid) self._fireExit( exitcode ) elif os.WIFSIGNALED(status): self._fireExit( os.WTERMSIG( status ) ) elif os.WIFSTOPPED(status): sig = os.WSTOPSIG(status) self.handlePosixSignal(sig) else: print("OMG WTF JUST HAPPENED??!?11/!?1?>!")
def wait(self): '''This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(), but, the child is technically still alive until its output is read by the parent. ''' if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: raise ExceptionPexpect('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED(status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED(status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED(status): # pragma: no cover # You can't call wait() on a child process in the stopped state. raise ExceptionPexpect('Called wait() on a stopped child ' + 'process. This is not supported. Is some other ' + 'process attempting job control with our child pid?') return self.exitstatus
def wait_for_active_job(signal_to_send=None): """ Wait for the active job to finish, to be killed by SIGINT, or to be suspended by ctrl-z. """ _clear_dead_jobs() act = builtins.__xonsh_active_job__ if act is None: return job = builtins.__xonsh_all_jobs__[act] obj = job['obj'] if job['bg']: return pgrp = job['pgrp'] obj.done = False # give the terminal over to the fg process _give_terminal_to(pgrp) # if necessary, send the specified signal to this process # (this hook was added because vim, emacs, etc, seem to need to have # the terminal when they receive SIGCONT from the "fg" command) if signal_to_send is not None: os.kill(obj.pid, signal_to_send) _, s = os.waitpid(obj.pid, os.WUNTRACED) if os.WIFSTOPPED(s): obj.done = True job['bg'] = True job['status'] = 'stopped' print() # get a newline because ^Z will have been printed print_one_job(act) elif os.WIFSIGNALED(s): print() # get a newline because ^C will have been printed if obj.poll() is not None: builtins.__xonsh_active_job__ = None _give_terminal_to(_shell_pgrp) # give terminal back to the shell
def post_send (self): ''' This routine is called after the fuzzer transmits a test case and returns the status of the target. @rtype: Boolean @return: Return True if the target is still active, False otherwise. ''' if not self.dbg.isAlive(): exit_status = self.dbg.get_exit_status() rec_file = open(self.crash_bin, 'a') if os.WCOREDUMP(exit_status): reason = 'Segmentation fault' elif os.WIFSTOPPED(exit_status): reason = 'Stopped with signal ' + str(os.WTERMSIG(exit_status)) elif os.WIFSIGNALED(exit_status): reason = 'Terminated with signal ' + str(os.WTERMSIG(exit_status)) elif os.WIFEXITED(exit_status): reason = 'Exit with code - ' + str(os.WEXITSTATUS(exit_status)) else: reason = 'Process died for unknown reason' self.last_synopsis = '[%s] Crash : Test - %d Reason - %s\n' % (time.strftime("%I:%M.%S"), self.test_number, reason) rec_file.write(self.last_synopsis) rec_file.close() return self.dbg.isAlive()
def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read. """ if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: raise ExceptionPexpect('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED(status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED(status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED(status): raise ExceptionPexpect( 'Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') return self.exitstatus
def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0): log.info(' '.join(cmd)) if dry_run: return exec_fn = search_path and os.execvp or os.execv pid = os.fork() if pid == 0: # in the child try: exec_fn(cmd[0], cmd) except OSError, e: sys.stderr.write("unable to execute %s: %s\n" % (cmd[0], e.strerror)) os._exit(1) sys.stderr.write("unable to execute %s for unknown reasons" % cmd[0]) os._exit(1) else: # in the parent # Loop until the child either exits or is terminated by a signal # (ie. keep waiting if it's merely stopped) while 1: try: pid, status = os.waitpid(pid, 0) except OSError, exc: import errno if exc.errno == errno.EINTR: continue raise DistutilsExecError, \ "command '%s' failed: %s" % (cmd[0], exc[-1]) if os.WIFSIGNALED(status): raise DistutilsExecError, \ "command '%s' terminated by signal %d" % \ (cmd[0], os.WTERMSIG(status)) elif os.WIFEXITED(status): exit_status = os.WEXITSTATUS(status) if exit_status == 0: return # hey, it succeeded! else: raise DistutilsExecError, \ "command '%s' failed with exit status %d" % \ (cmd[0], exit_status) elif os.WIFSTOPPED(status): continue else: raise DistutilsExecError, \ "unknown error executing '%s': termination status %d" % \ (cmd[0], status)
def platformExec(self, cmdline): # Very similar to posix, but not # quite close enough... self.execing = True cmdlist = e_cli.splitargs(cmdline) os.stat(cmdlist[0]) pid = os.fork() if pid == 0: try: # Don't use PT_TRACEME -- on some linux (tested on ubuntu) # it will cause immediate asignment of ptrace slot to parent # without parent having PT_ATTACH'D.... MAKES SYNCHRONIZATION HARD # SIGSTOP our self until parent continues us os.kill(os.getpid(), signal.SIGSTOP) os.execv(cmdlist[0], cmdlist) except Exception as e: print(e) sys.exit(-1) # Attach to child. should cause SIGSTOP if 0 != v_posix.ptrace(PT_ATTACH, pid, 0, 0): raise Exception("PT_ATTACH failed! linux platformExec") # Eat all SIGSTOP (or other signal) and break from loop on SIGTRAP. # SIGTRAP triggered by execv while PTRACE_ATTACH'd while True: wpid, status = os.waitpid(pid, os.WUNTRACED) if wpid != pid: # should never happen continue if os.WIFSTOPPED(status): cause = os.WSTOPSIG(status) if cause == signal.SIGTRAP: break if v_posix.ptrace(v_posix.PT_CONTINUE, pid, 0, 0) != 0: raise Exception("PT_CONTINUE failed! linux platformExec") # Do a single step, which will allow a new stop event for the # rest of vtrace to eat up. if v_posix.ptrace(v_posix.PT_STEP, pid, 0, 0) != 0: raise Exception("PT_CONTINUE failed! linux platformExec") self.pthreads = [pid, ] self.setMeta("ExeName", self._findExe(pid)) return pid