system () возвращает -1, errno = 10 при входе в Oracle - PullRequest
2 голосов
/ 22 марта 2019

После команды EXEC SQL CONNECT user/pass;, system("") возвращает -1 с errno = 10.

Мы перенесли эту программу из Oracle 10g в HP-UX в Oracle 11g в Red Hat Linux.Это не происходило в HP-UX / Oracle 10g.

#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>

typedef char vc2[10];
typedef char vc4[20];

EXEC SQL INCLUDE sqlca;

char *oracleid = "user/pass";
char msg[400];
char env[20][200];
#define DEBUG 1
int  status = 1;


int main( argc, argv )
int argc;
char **argv;
{
    int        load_stat;

    EXEC SQL BEGIN DECLARE SECTION;

    EXEC SQL TYPE vc2 is STRING(11) REFERENCE;

    vc2        load_date;

    EXEC SQL END DECLARE SECTION;

        load_stat = system("");
sprintf(msg,"Value of errno: %d\n", errno);
fprintf(stderr,"%s\n",msg);
sprintf(msg, "status: %d\n ",load_stat);
fprintf(stderr,"%s\n",msg);

sprintf(msg, "ORACLE Logon ID is %s\n",oracleid);
fprintf(stderr,"%s\n",msg);

    EXEC SQL CONNECT :oracleid;

fprintf(stderr,"Connected to Oracle\n");
        load_stat = system("");
sprintf(msg,"Value of errno: %d\n", errno);
fprintf(stderr,"%s\n",msg);
sprintf(msg, "status 2: %d \n",load_stat);
fprintf(stderr,"%s\n",msg);

    EXEC SQL COMMIT RELEASE;

fprintf(stderr,"released Oracle\n");
        load_stat = system("");
sprintf(msg,"Value of errno: %d\n", errno);
fprintf(stderr,"%s\n",msg);
sprintf(msg, "status 3: %d \n",load_stat);
fprintf(stderr,"%s\n",msg);

exit(0);
}

Приведенный выше код возвращает следующее:

Значение errno: 0

status:0

Идентификатор входа в систему Oracle - пользователь / пароль

Подключен к Oracle

Значение errno: 10

статус 2: -1

выпущен Oracle

Значение ошибки: 10

статус 3: -1

1 Ответ

5 голосов
/ 23 марта 2019

Оракул ужасен.Они установили обработчик SIGCHLD, который пожинает все дочерние процессы, которые выходят, нарушая любое использование дочерних процессов в приложении.Вероятно, вы можете это исправить, позвонив signal(SIGCHLD,SIG_DFL) после подключения, чтобы удалить их глупости.

...