Передача argc и argv в поток в c - PullRequest
       1

Передача argc и argv в поток в c

0 голосов
/ 26 февраля 2019

Я пытаюсь закодировать чат в C с графическим интерфейсом.С одной стороны, у меня есть клиент для моего чата, с другой стороны, у меня есть приложение GTK для отображения моего чата.Чтобы запустить их обоих одновременно, я буду использовать pthread (открытый для других предложений).

Моя проблема в том, что мне нужны и argc, и argv, чтобы мой клиент работал правильно.Из того, что я видел, pthread_create () принимает в качестве аргумента функцию для выполнения и только один аргумент.Из других тем я видел, что я мог бы использовать структуру данных, чтобы содержать их обе, но, похоже, не могу правильно их привести.Вот что у меня есть:

typedef struct {
    int *argc;
    char ** argv;
} args_list;

void * simple_client(void * arg){
    int argc = (int) arg->argc;
    char * argv[] = (char *) arg->argv;
    printf("in thread : %d / %s, %s \n", argc, argv[0], argv[1]);

    return 0;
}

int main(int argc, char * argv[])
{   
    printf("int main : %d / %s, %s \n", argc, argv[0], argv[1]);
    args_list * args = malloc(sizeof *args);
    args-> argc = &argc;
    args-> argv = &argv;

    pthread_t thread1;

    if (pthread_create(&thread1, NULL, simple_client, args)) {
        perror("pthread_create");
        return EXIT_FAILURE;
    }
    if (pthread_join(thread1, NULL)) {
        perror("pthread_join");
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

Отсюда я получаю: error: запрос на член 'argc' во что-то, не являющееся структурой или объединением из int argc = (int) arg-> argc;и то же самое с argv из char * argv [] = (char *) arg-> argv;

Что будет причиной этих ошибок?И как вы думаете, это хороший способ реализовать онлайн-чат с графическим интерфейсом GTK?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Несколько проблем с типами здесь.

simple_client занимает void*.Чтобы использовать переданное значение как arg_list, необходимо привести его к одному.

void * simple_client(void * argp){
    arg_list* arg = (arg_list*) argp;

Вам не нужен дополнительный уровень косвенности в arg_list.Он должен содержать те же типы, что и аргументы main.

    //in main:
    args->argc = argc; 
    args->argv = argv; 

    //in simple_client:
    int argc =  arg->argc;
    char** argv = arg->argv;

В исходном коде вы сохраняли «адрес указателя на символ *» в «указатель на символ *».

0 голосов
/ 26 февраля 2019

Определите struct следующим образом:

typedef struct tARGS
{
    int argc;
    char **argv;
} ARGS;

Затем в main:

ARGS args;
args.argc = argc;
args.argv = argv;

Технически, argc на самом деле не требуется, так как следующий кодобработает каждый аргумент в args (argv[argc] является гарантированным нулевым указателем по стандарту C):

ARGS args = *(ARGS *)arg;
while(*args.argv)
{
    puts(*args.argv);
    args.argv++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...