solucion - Programa C que causa falla de segmentación
segmentation fault(core dumped) c (5)
"Ejecutando el comando -a prueba -d deimf -i input.txt -l log.txt -u bc @ abc out.txt"
Simplemente te olvidaste de dar la opción -o:
Ejecución del comando -a prueba -d deimf -i entrada.txt -l log.txt -u bc @ abc -o out.txt
Tengo un programa C debajo escrito en UNIX. Estoy recibiendo un error de segmentación. No estoy llegando a donde me estoy perdiendo algo. Alguien puede ayudarme porfavor.
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
char* app_name = NULL;
char* pInFile = NULL;
int main(int argc, char *argv[])
{
char* arg0 = argv[0];
char* pdebug = "miecf";
char* pLogfile = NULL;
char* pUserid = NULL;
char* pOutFile = NULL;
int c;
while( (c = getopt(argc, argv, ":a:d:i:l:u:o")) != EOF)
{
switch (c)
{
case ''a'':
app_name = optarg;
break;
case ''d'':
pdebug = optarg;
break;
case ''i'':
pInFile = optarg;
break;
case ''l'':
pLogfile = optarg;
break;
case ''u'':
pUserid = optarg;
break;
case ''o'':
pOutFile = optarg;
break;
default:
fprintf( stderr, "unknown option /'%c/'/n", optopt );
break;
} /* switch(c) */
} /* while( getopt()) */
printf("app_name is [%s]/n",app_name);
printf("pdebug is [%s]/n",pdebug);
printf("pInFile is [%s]/n",pInFile);
printf("pLogfile is [%s]/n",pLogfile);
printf("pUserid is [%s]/n",pUserid);
printf("pOutFile is [%s]/n",pOutFile);
return 0;
}
Ejecutando comando
-a test -d deimf -i input.txt -l log.txt -u bc@abc -o out.txt
Salida
app_name is [test]
pdebug is [deimf]
pInFile is [input.txt]
pLogfile is [log.txt]
pUserid is [bc@abc]
run[2]: 10448 Segmentation Fault(coredump)
Informe Dbx
program terminated by signal SEGV (no mapping at the fault address)
0xff232370: strlen+0x0050: ld [%o2], %o1
(dbx) where
=>[1] strlen(0x0, 0xfffffaf0, 0x0, 0xffbff1a8, 0x0, 0x2b), at 0xff232370
[2] _ndoprnt(0x10f77, 0xffbff26c, 0xffbfe8e9, 0x0, 0x0, 0x0), at 0xff29e4d4
[3] printf(0x10f68, 0x21100, 0x0, 0x2111e, 0xff3303d8, 0x14), at 0xff2a0680
[4] main(0xc, 0xffbff304, 0xffbff4ad, 0xffbff4b8, 0x0, 0xffffffff), at 0x10e8
El problema es que pOutFile es NULL cuando intentas imprimirlo. Muchos SO (libc) no manejan esto y usted está tratando de hacer que imprima una variable que no tiene un valor.
Prueba esto:
if (pOutFile != NULL)
printf("pOutFile is [%s]/n",pOutFile);
else
printf("pOutFile is NULL/n");
Adicional:
pOutFile no tiene un valor incluso cuando especificó el modificador -o porque no puso un: después de la o en la llamada getopt. Específicamente, los: vienen después de la carta. Debería ser esto:
while( (c = getopt(argc, argv, "a:d:i:l:u:o:")) != EOF)
Falta :
es el problema:
while( (c = getopt(argc, argv, ":a:d:i:l:u:o:")) != EOF)
^
No pasó -o antes de "out.txt", por lo que está desreferenciando un puntero nulo en la impresiónf de pOutFile. Eso es lo que noté a primera vista.
Parece que está segfaulting en esta línea:
printf("pOutFile is [%s]/n",pOutFile);
A juzgar por su línea de comandos, no está utilizando un pOutFile
-o
, por lo que pOutFile
permanece NULO, pero está tratando de printf
.