【问题标题】:Processes & threads C programming on Windows: trouble with command line argumentsWindows 上的进程和线程 C 编程:命令行参数的问题
【发布时间】:2016-04-22 02:45:03
【问题描述】:

我正在通过 Netbeans(使用 Windows 7)使用 C 语言处理进程和线程。 我正在使用命令行参数,但是在运行程序时它无法正常工作。如果我使用 Run Netbeans 按钮,它不会询问我需要输入的参数,而是会显示消息:

/cygdrive/C/Program Files/Netbeans 8.1/ide/bin/nativeexecution/dorun.sh: 第 33 行:3592 分段错误(核心转储)sh "${SHFILE}"

我正在尝试使用 cmd 控制台,但以这种方式调用该函数似乎出错了:

gcc ej1.c 2

我应该使用这种格式:

gcc font_file.c -o exe_file.exe

但据我所知,Netbeans 文件夹中没有 .exe 文件。这是我在running through Windows cmd 时收到的消息。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char *argv[]) {
    HANDLE hThread2;
    DWORD IDThread2;
    int n = atoi(argv[1]);
    printf("Parámetro: n = %d\n\n",n);

    printf("Soy el proceso %d\n",(int)GetCurrentProcessId());
    printf("Comienza el hilo primario (ID %d)\n\n",(int)GetCurrentThreadId());


    void func(int *n){
        printf("Comienza el hilo secundario (ID %d)\n",(int)GetCurrentThreadId());
        int i;
        int var = 0;
        for(i=0; i<*n; i++){
            var++;
        }
        printf("Valor final de la variable: %d\n",var);
        printf("Finaliza el hilo secundario (ID %d)\n\n",(int)GetCurrentThreadId());
    }



    hThread2 = CreateThread (NULL,
                            0,
                            (LPTHREAD_START_ROUTINE) func,
                            &n,
                            0,
                            &IDThread2);

    WaitForSingleObject(hThread2, // Este es el descriptor dell objeto por el que se espera
                        INFINITE);

    CloseHandle(hThread2);

    printf("Finaliza el hilo primario (ID %d)\n",(int)GetCurrentThreadId());
    return 0;
}

【问题讨论】:

  • 除了您在使用 netbeans 时遇到的问题,以及您的代码尝试创建线程的方式之外,在检查 argc 以确保参数确实存在之前,切勿访问 argv[0] 之外的 argv[] .你的编译器应该告诉你未使用的参数argc。当argc不包含正确的值时,输出usage语句到stderr并调用exit( EXIT_FAILURE )

标签: c windows multithreading netbeans process


【解决方案1】:

函数CreateThread 要求第三个参数是ThreadProc 类型,它是DWORD(*)(LPVOID) 类型的函数指针。

DWORD 是一个无符号的 32 位整数,LPVOID 是一个指向 void 的指针。

你的代码传递给CreateThread的函数的类型是void(*)(int*),类型明显不兼容。

C 标准规定,通过与函数类型不兼容的函数指针调用函数将导致未定义的行为。这可能表现为分段错误。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多