Re: Problem with fork inside a thread and system()
- From: CMorgan <uestebanez@xxxxxxxxx>
- Date: Fri, 28 Dec 2007 08:42:22 -0800 (PST)
On 28 dic, 17:17, CMorgan <uesteba...@xxxxxxxxx> wrote:
On 28 dic, 16:55, CMorgan <uesteba...@xxxxxxxxx> wrote:
On 28 dic, 16:36, Rainer Weikusat <rweiku...@xxxxxxxxxxx> wrote:
CMorgan <uesteba...@xxxxxxxxx> writes:
I am experiencing an annoying problem withfork() andsystem()
In my program I need to launch the "pppd" from a thread, so, I create
a new process withforkand then in the child process I launch with
systemthepppdto connect an embeddedsystemto internet.
The problem is thatpppdfails.
Here is my example code:
int my_thread(...)
{
pid=fork();
if (pid==EAGAIN || pid==ENOMEM)
{
abort();
}
switch(pid)
{
case 0: // child
{
system("/usr/sbin/pppdcall gprs");
printf("Error execv:%s",strerror(errno));
exit(0);
}
break;
case -1:
abort();
break;
default: // father
father stuff.....
}
}
Independently (but maybe related to) of your problem:systemalready
forks & waits for you, meaning there is no reason to callsystemfrom
a forked processes, except insofar this means the process callingsystemisn't halted until the command has exited. If you don't want
the latter, don't usesystem,
Ok I Have tryed with execv:
I just change the exec line for this one:
execv("/usr/sbin",macapi_gprs_ref->cmd_argv);
explanation:
"macapi_gprs_ref->cmd_argv" stores the parameters. I dumped it to my
log to check if parameters are right, and they are right.
Values of argv are:
parameter 0 = /usr/sbin/pppd
parameter 1 = call
parameter 2 = gprs
the result of execv is wrong:
"Error execv:Permission denied"
This is confusing, any hint?
Thanks
OK, I have advanced a little bit,
latest problem was due to an error in spanish translatin of execv man
page!!!
firs parameter of execv is not the path to the command but also the
complete path and file.
Anyway, now the script is launched but it fails
In var log messages I can read:
... pppd 2.4.3 started by root, uid 0
... Connect script failed
And the strangest thing is that from my easy program (only a main and
a fork) it works!!!!
any idea?
Regards,
Unai
Ok, I have made another test program just to discard bugs (my
applications is really big) and the result is the same, that is, when
I call execv from a child process created from a thread the pppd
script fails!!!!
Here I paste my two test program, the test that fails, the test that
success:
------- TEST PROGRAM THAT FAILS -------
#include <pthread.h>
#include <sys/time.h>
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
static bool ActivarGPRS (void);
static void* macapi_gprs_connect_thread(void *param);
int main(int argc,char** argv)
{
pthread_t thread;
pthread_create(&thread,NULL,&macapi_gprs_connect_thread,NULL);
while(1)
{
sleep(100);
}
return 0;
}
static void* macapi_gprs_connect_thread(void *param)
{
if( true == ActivarGPRS() )
printf("GPRS activado\n");
else
printf("No se puede activar el GPRS\n");
}
static bool ActivarGPRS (void)
{
int pid;
struct timeval T0, T1;
FILE *fp = NULL;
//************ GPRS *************
printf ("ActivarGPRS\n");
if ((pid = fork ()) < 0)
{
printf ("Error fork\n");
return false;
}
// Tiempo de arranque
gettimeofday (&T0, NULL);
if (pid == 0)
{
char* argv[] = {"/usr/sbin/pppd","call","gprs",NULL};
// Proceso hijo
//system ("/usr/sbin/pppd call gprs > /home/sattoll/
StatusGPRS");
execv(argv[0],argv);
printf("execv failure:%s\n",strerror(errno));
system ("rm -f /home/sattoll/StatusGPRS");
exit (0);
}
else
{
// Proceso padre
while ((fp = fopen ("/home/sattoll/GPRSOK", "r")) == NULL)
{
// Si pasa mucho tiempo sin conexion (1 minutos), se
sale y se reintentera mas tarde
gettimeofday (&T1, NULL);
if ((T1.tv_sec - T0.tv_sec) > 40)
{
printf ("Timeout\n");
system ("killall -2 pppd");
// hay que esperar porque si no se ha conectado al
CE
system ("sleep 3");
system ("rm -f /home/sattoll/StatusGPRS");
return false;
}
}
return true;
}
}
------- END OF TEST PROGRAM THAT FAILS -------
------- TEST PROGRAM THAT WORKS -------------
#include <sys/time.h>
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
static bool ActivarGPRS (void);
int main(int argc,char** argv)
{
if( true == ActivarGPRS() )
printf("GPRS activado\n");
else
printf("No se puede activar el GPRS\n");
}
static bool ActivarGPRS (void)
{
int pid;
struct timeval T0, T1;
FILE *fp = NULL;
//************ GPRS *************
printf ("ActivarGPRS\n");
if ((pid = fork ()) < 0)
{
printf ("Error fork\n");
return false;
}
// Tiempo de arranque
gettimeofday (&T0, NULL);
if (pid == 0)
{
char* argv[] = {"/usr/sbin/pppd","call","gprs",NULL};
// Proceso hijo
//system ("/usr/sbin/pppd call gprs > /home/sattoll/
StatusGPRS");
execv(argv[0],argv);
printf("execv failure:%s\n",strerror(errno));
system ("rm -f /home/sattoll/StatusGPRS");
exit (0);
}
else
{
// Proceso padre
while ((fp = fopen ("/home/sattoll/GPRSOK", "r")) == NULL)
{
// Si pasa mucho tiempo sin conexion (1 minutos), se
sale y se reintentera mas tarde
gettimeofday (&T1, NULL);
if ((T1.tv_sec - T0.tv_sec) > 40)
{
printf ("Timeout\n");
system ("killall -2 pppd");
// hay que esperar porque si no se ha conectado al
CE
system ("sleep 3");
system ("rm -f /home/sattoll/StatusGPRS");
return false;
}
}
return true;
}
}
----------- END OF TEST PROGRAM THAT WORKS
.
- References:
- Problem with fork inside a thread and system()
- From: CMorgan
- Re: Problem with fork inside a thread and system()
- From: Rainer Weikusat
- Re: Problem with fork inside a thread and system()
- From: CMorgan
- Re: Problem with fork inside a thread and system()
- From: CMorgan
- Problem with fork inside a thread and system()
- Prev by Date: Re: Problem with fork inside a thread and system()
- Next by Date: Re: what are the respective tasks of windows manager, desktop, and the gui app
- Previous by thread: Re: Problem with fork inside a thread and system()
- Index(es):
Relevant Pages
|