here is a sample code (vfork_execve.c) to demonstrate a locking problem.

The code launch 3 threads :
 1 signal
 2 endless do nothing
 3 a socket server (bind to 127.0.0.1:12345)

The server accept 3 cmd:
 1) close => close cnx
 2) sleep => use vfork /execv to launch external "/bin/sleep 20"

to reproduce the lock:

launch ./vfork_execve
connect to server:
=>telnet 127.1 12345
type quickly
sleep
close
=>telnet 127.1 12345
->close
the process telnet and vfork_execve is locked until the first 'sleep' cmd  has
return.

I've no idea why the process locks;
maybe an implementation trouble or a bug.

Any suggestions are welcome.
Best Regards.

CC=gcc

CFLAGS= -ansi -Wall  -I/usr/local/ssl/include
SPEC_INC_BSD= -DUNDER_BSD
CCFLAGS_BSD= -g2 $(CFLAGS) $(SPEC_INC_BSD)

LIB_THREAD_LINUX= -lpthread
LIB_THREAD_BSD= -pthread
LIBS_SOLARIS= -lsocket -lnsl 
LIB_LINUX= 
LIB_BSD= 


CCFLAGS=$(CCFLAGS)
LIBS= $(LIB_THREAD_LINUX) $(LIB_BSD)

OBJ= $(SRC:.c=.o)


all: vfork_execve vfork_execve2

vfork_execve: vfork_execve.o
        $(CC) -o vfork_execve $(LIBS) vfork_execve.o
vfork_execve.o: vfork_execve.c
        $(CC) $(CCFLAGS) -o $*.o -c $*.c

vfork_execve2: vfork_execve2.o
        $(CC) -o vfork_execve2 $(LIBS) vfork_execve2.o
vfork_execve2.o: vfork_execve2.c
        $(CC) $(CCFLAGS) -o $*.o -c $*.c
clean:
        @rm -f *.o y.tab.c lex.yy.c

<<inline: vfork_execve.c>>

<<inline: vfork_execve2.c>>

Reply via email to