GVKun编程网logo

在Windows中处理子进程崩溃(处理子程序失败了,所有的子程序是无效的)

10

对于想了解在Windows中处理子进程崩溃的读者,本文将提供新的信息,我们将详细介绍处理子程序失败了,所有的子程序是无效的,并且为您提供关于linux模拟多线程崩溃和多进程崩溃、python在wind

对于想了解在Windows中处理子进程崩溃的读者,本文将提供新的信息,我们将详细介绍处理子程序失败了,所有的子程序是无效的,并且为您提供关于linux模拟多线程崩溃和多进程崩溃、python在windows下创建隐藏窗口子进程的方法、select()可以在Windows中处理的套接字的最大数量是多less?、winapi – 在Windows中等待孙子进程的有价值信息。

本文目录一览:

在Windows中处理子进程崩溃(处理子程序失败了,所有的子程序是无效的)

在Windows中处理子进程崩溃(处理子程序失败了,所有的子程序是无效的)

我正在Windows命令提示符下运行python脚本。它调用下面的函数,该函数使用LAME将MP3文件转换为wave文件。

def convert_mp3_to_wav(input_filename, output_filename):    """    converts the incoming mp3 file to wave file    """    if not os.path.exists(input_filename):        raise AudioProcessingException, "file %s does not exist" % input_filename    command = ["lame", "--silent", "--decode", input_filename, output_filename]    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)    (stdout, stderr) = process.communicate()    if process.returncode != 0 or not os.path.exists(output_filename):        raise AudioProcessingException, stdout    return output_filename

不幸的是,LAME总是在某些MP3上崩溃(并达到其名称)。出现Windows“您的程序已崩溃”对话框,该对话框冻结了我的脚本。关闭窗口对话框后,将引发AudioProcessingException。无需告诉Windows关闭,我只想脚本引发异常,然后转到下一个MP3。

有没有办法解决?最好通过更改脚本而不是在Unix上运行脚本。

我正在使用Windows 7和Python 2.6

答案1

小编典典

经过更多的谷歌搜索后,我偶然发现了这个 http://www.activestate.com/blog/2007/11/supressing-
windows-error-report-messagebox-subprocess-and-
ctypes

它需要一些修补,但是下面的方法现在不会出现令人讨厌的Windows消息:)注意subprocess.Popen中的creationflags =subprocess_flags

def convert_mp3_to_wav(input_filename, output_filename):    if sys.platform.startswith("win"):        # Don''t display the Windows GPF dialog if the invoked program dies.        # See comp.os.ms-windows.programmer.win32        # How to suppress crash notification dialog?, Jan 14,2004 -        # Raymond Chen''s response [1]        import ctypes        SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN        ctypes.windll.kernel32.SetErrorMode(SEM_NOGPFAULTERRORBOX);        subprocess_flags = 0x8000000 #win32con.CREATE_NO_WINDOW?    else:        subprocess_flags = 0    """    converts the incoming mp3 file to wave file    """    if not os.path.exists(input_filename):        raise AudioProcessingException, "file %s does not exist" % input_filename    #exec("lame {$tmpname}_o.mp3 -f {$tmpname}.mp3 && lame --decode {$tmpname}.mp3 {$tmpname}.wav");    command = ["lame", "--silent", "--decode", input_filename, output_filename]    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=subprocess_flags)    (stdout, stderr) = process.communicate()    if process.returncode != 0 or not os.path.exists(output_filename):        raise AudioProcessingException, stdout    return output_filename

linux模拟多线程崩溃和多进程崩溃

linux模拟多线程崩溃和多进程崩溃

结论是:
多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃;
多进程下如果其中一个进程崩溃了对其余进程没有影响;

多线程

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>

void *fun1(void *arg)
{
    printf("fun1 enter\n");
    while(1)
    {
        printf("%s\n", __FUNCTION__);
        usleep(1000 * 1000);
    }
    printf("fun1 exit\n");
    return ((void *)1);
}

void *fun2(void *arg)
{
    printf("fun1 enter\n");
    usleep(1000 * 3000);
    char * ptr = (char *)malloc(sizeof(char));
    printf("ptr1: 0x%x\n", ptr);
    ptr = NULL;
    printf("ptr2: 0x%x\n", ptr);
    free(ptr);
    memcpy(ptr, "123", 3);
    printf("ptr3: 0x%x\n", ptr);
    printf("fun2 exit\n");
    return ((void *)2);
}

int main(void)
{
    pthread_t tid1, tid2;
    int err;
    
    err = pthread_create(&tid1, NULL, fun1, NULL);
    assert(0 == err);
    err = pthread_create(&tid2, NULL, fun2, NULL);
    assert(0 == err);
    
    printf("main join ...\n");
//    getchar();
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    
    return 0;
}

多进程

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>

void fun(void *arg)
{
    printf("fun1 enter\n");
    usleep(1000 * 3000);
    char * ptr = (char *)malloc(sizeof(char));
    printf("ptr1: 0x%x\n", ptr);
    ptr = NULL;
    printf("ptr2: 0x%x\n", ptr);
    free(ptr);
    memcpy(ptr, "123", 3);
    printf("ptr3: 0x%x\n", ptr);
    printf("fun2 exit\n");
    return ;
}

int main(int argc, char *argv[])
{
    assert(2 == argc);
    pid_t pid;
    int i;
    for(i=0; i<atoi(argv[1]); i++)
    {
        pid = fork();
        if(0 > pid)
        {
            printf("fork error");
            exit(1);
        }
        else if(0 == pid)
        {
            printf("child pid is %lu\n", (unsigned long)getpid());
            fun(NULL);
            exit(0);
        }
    }
    
    printf("parent pid is %lu\n", (unsigned long)getpid());
    while(-1 != wait(NULL));        //等待所有子进程结束
    printf("main return\n");
    getchar();
    
    return 0;
}

python在windows下创建隐藏窗口子进程的方法

python在windows下创建隐藏窗口子进程的方法

本文实例讲述了python在windows下创建隐藏窗口子进程的方法。分享给大家供大家参考。具体实现方法如下:

import subprocess
IS_WIN32 = 'win32' in str(sys.platform).lower()
def subprocess_call(*args,**kwargs):
  #also works for Popen. 
  #It creates a new *hidden* window,#so it will work in frozen apps (.exe).
  if IS_WIN32:
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW
    startupinfo.wShowWindow = subprocess.SW_HIDE
    kwargs['startupinfo'] = startupinfo
  retcode = subprocess.call(*args,**kwargs)
  return retcode

希望本文所述对大家的Python程序设计有所帮助。

select()可以在Windows中处理的套接字的最大数量是多less?

select()可以在Windows中处理的套接字的最大数量是多less?

select()可以默认处理64个套接字,我可以通过在编译时重写FD_SETSIZE常量来改变这个限制。 但是FD_SETSIZE可以使用的最大数量是多less?

也应该真的使用select()在Windows下,或者我应该使用WSAEventSelect() ? (不知道WSAEventSelect()允许超过64个套接字)。

多端口监听套接字linux

在Windows上的套接字 – 我错过了我的程序中的东西?

为什么套接字连接()到它自己的临时端口?

什么时候closuresCAsyncSocket是安全的?

Python套接字问题:Windows中的socket.MSG_DONTWAIT

MSDN没有具体的FD_SETSIZE的上限。 但是有多少因素影响了实际的限制。

并行连接限制(system-wise),一般工作站上约1000〜4000。

性能。 Windows的select()实现得非常糟糕,您应该考虑使用WSAAsyncSelect()和超过一千个套接字的完成端口。

最大数量的套接字取决于底层的WinSock服务提供者(WinSock本身就是接口封装)。 请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169(v=vs.85).aspx

WSAEventSelect()在select()上有一些额外的功能,但FD_SETSIZE由两个函数处理相同。

总结

以上是小编为你收集整理的select()可以在Windows中处理的套接字的最大数量是多less?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

winapi – 在Windows中等待孙子进程

winapi – 在Windows中等待孙子进程

是否可以等待 Windows中子进程启动的所有进程?我无法修改子进程或孙进程.

具体来说,这就是我想要做的.我的进程启动uninstallA.exe.进程uninistallA.exe启动uninstallB.exe并立即退出,uninstallB.exe运行一段时间.我想等待uninstallB.exe退出,以便我知道何时卸载完成.

使用CreateJobObject创建作业对象.使用CreateProcess以挂起状态启动UninstallA.exe.使用AssignProcesstoJobObject将新进程分配给作业对象.通过在从CreateProcess返回的线程的句柄上调用ResumeThread来启动运行UninstallA.exe.

然后是困难部分:等待作业对象完成其执行.不幸的是,这比任何人合理希望的要复杂得多.基本思想是创建一个I / O完成端口,然后创建对象对象,将其与I / O完成端口关联,最后等待I / O完成端口(使用GetQueuedCompletionStatus获取其状态).雷蒙德·陈(Raymond Chen)在他的blog上进行了演示(以及对此的解释).

今天关于在Windows中处理子进程崩溃处理子程序失败了,所有的子程序是无效的的介绍到此结束,谢谢您的阅读,有关linux模拟多线程崩溃和多进程崩溃、python在windows下创建隐藏窗口子进程的方法、select()可以在Windows中处理的套接字的最大数量是多less?、winapi – 在Windows中等待孙子进程等更多相关知识的信息可以在本站进行查询。

本文标签: