In some cases the system command is returning with -1 even it succeded
- From: "syam_thegeek" <syam.prasad.t@xxxxxxxxx>
- Date: 19 Apr 2006 00:11:05 -0700
Any One can you explanation why this is happening .
In the below program
In some cases the system command is returning with -1 even the command
in the system call had succeded
To have a look i am attaching strace out put also
to be clear u can search for XX in the strace output from that point u
can make some thing .....
you can compile with these flags
gcc -Wall -W -O2 systembug.c -lpthread
Senario Explanation :
Actual behavior
system
thread 1
blocking of SIG_CHLD
(system())
waitpid()thread ;
; ........thread 2
; childexit exit_group(0)
;
waitpid of system returned
with child procees pid ... ;
;
;
thread3
------- signal handler
{
while(waitpid(NOHUNG)>0)
(return with -1 and ECHILD)
{
}
}
waitpid of system call returns success with pid of the system call's
child process
After this signal handler was called and waitpid in the signal handler
returned with failure
(This is how i need but in some cases its works like below)
system
thread 1
blocking of SIG_CHLD
(system())
waitpid()thread
........thread 2
childexit exit_group(0) thread3
------- signal
handler
{
while(waitpid(NOHUNG)>0)
{
}
}
waitpid of system call returns(with failure) because the waitpid in the
signal handler was returned with pid of the system call's child process
so the system calls wait pid will return with -1 and errno ECHILD
#include<signal.h>
#include <errno.h>
#include <wait.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
void signalHandler(int i);
void *thread1(void *);
void *thread1(void *arg)
{
while(1)
sleep(1);
return arg;
}
int main()
{
int ret =-1;
int res =-1;
pthread_t th;
res = pthread_create (&th, NULL, thread1, NULL);
if (res)
{
printf ("pthread_create failed %d\n", res);
}
signal(SIGCHLD,signalHandler);
ret = system("ls systembug.c");
printf("XX the retval %d errno %d \n",ret,errno);
return 1;
}
void signalHandler(int signal)
{
int stat = 0;
int pid = 0;
printf("Caught the signal \n");
while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)
{
printf("Child process exited signum %d\n",signal);
}
}
STRACE OUTPUT
3333 execve("./a.out", ["./a.out"], [/* 61 vars */]) = 0
3333 uname({sys="Linux", node="WS29P191", ...}) = 0
3333 brk(0) = 0x804a000
3333 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
3333 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
3333 open("/etc/ld.so.cache", O_RDONLY) = 3
3333 fstat64(3, {st_mode=S_IFREG|0644, st_size=106111, ...}) = 0
3333 old_mmap(NULL, 106111, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
3333 close(3) = 0
3333 open("/lib/tls/libpthread.so.0", O_RDONLY) = 3
3333 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360I\0"..., 512) = 512
3333 fstat64(3, {st_mode=S_IFREG|0755, st_size=88272, ...}) = 0
3333 old_mmap(NULL, 65004, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x40032000
3333 madvise(0x40032000, 65004, MADV_SEQUENTIAL|0x1) = 0
3333 old_mmap(0x4003f000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x4003f000
3333 old_mmap(0x40040000, 7660, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40040000
3333 close(3) = 0
3333 open("/lib/tls/libc.so.6", O_RDONLY) = 3
3333 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@S\1\000"..., 512) =
512
3333 fstat64(3, {st_mode=S_IFREG|0755, st_size=1345545, ...}) = 0
3333 old_mmap(NULL, 1128748, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x40042000
3333 madvise(0x40042000, 1128748, MADV_SEQUENTIAL|0x1) = 0
3333 old_mmap(0x4014b000, 32768, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x109000) = 0x4014b000
3333 old_mmap(0x40153000, 10540, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40153000
3333 close(3) = 0
3333 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40156000
3333 set_thread_area({entry_number:-1 -> 6, base_addr:0x40156080,
limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,
limit_in_pages:1, seg_not_present:0, useable:1}) = 0
3333 munmap(0x40018000, 106111) = 0
3333 set_tid_address(0x401560c8) = 3333
3333 rt_sigaction(SIGRTMIN, {0x40036950, [], SA_SIGINFO}, NULL, 8) = 0
3333 rt_sigprocmask(SIG_UNBLOCK, [RTMIN], NULL, 8) = 0
3333 getrlimit(RLIMIT_STACK, {rlim_cur=RLIM_INFINITY,
rlim_max=RLIM_INFINITY}) = 0
3333 _sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbfffef28, 35, (nil), 0})
= 0
3333 mmap2(NULL, 2101248, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40157000
3333 brk(0) = 0x804a000
3333 brk(0x806b000) = 0x806b000
3333 brk(0) = 0x806b000
3333 mprotect(0x40157000, 4096, PROT_NONE) = 0
3333 clone(child_stack=0x40357b08,
flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,
parent_tidptr=0x40357bf8, {entry_number:6, base_addr:0x40357bb0,
limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,
limit_in_pages:1, seg_not_present:0, useable:1},
child_tidptr=0x40357bf8) = 3343
3333 rt_sigaction(SIGCHLD, {0x8048614, [CHLD], SA_RESTART}, {SIG_DFL},
8) = 0
3333 rt_sigaction(SIGINT, {SIG_IGN}, {SIG_IGN}, 8) = 0
3333 rt_sigaction(SIGQUIT, {SIG_IGN}, {SIG_IGN}, 8) = 0
3343 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
3343 rt_sigaction(SIGCHLD, NULL, {0x8048614, [CHLD], SA_RESTART}, 8) =
0
3343 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
3343 nanosleep({1, 0}, <unfinished ...>
3333 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
3333 clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD,
parent_tidptr=0xbffff024) = 3350
3333 waitpid(3350, <unfinished ...>
3350 rt_sigaction(SIGINT, {SIG_IGN}, NULL, 8) = 0
3350 rt_sigaction(SIGQUIT, {SIG_IGN}, NULL, 8) = 0
3350 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
3350 execve("/bin/sh", ["sh", "-c", "ls systembug.c"], [/* 61 vars
*/]) = 0
3350 uname({sys="Linux", node="WS29P191", ...}) = 0
3350 brk(0) = 0x80bb000
3350 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
3350 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
3350 open("/etc/ld.so.cache", O_RDONLY) = 3
3350 fstat64(3, {st_mode=S_IFREG|0644, st_size=106111, ...}) = 0
3350 old_mmap(NULL, 106111, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
3350 close(3) = 0
3350 open("/lib/libreadline.so.4", O_RDONLY) = 3
3350 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\260"..., 512) =
512
3350 fstat64(3, {st_mode=S_IFREG|0755, st_size=176736, ...}) = 0
3350 old_mmap(NULL, 178420, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x40032000
3350 madvise(0x40032000, 178420, MADV_SEQUENTIAL|0x1) = 0
3350 old_mmap(0x40059000, 16384, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x27000) = 0x40059000
3350 old_mmap(0x4005d000, 2292, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4005d000
3350 close(3) = 0
3350 open("/lib/libhistory.so.4", O_RDONLY) = 3
3350 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\30\0\000"..., 512) =
512
3350 fstat64(3, {st_mode=S_IFREG|0755, st_size=24828, ...}) = 0
3350 old_mmap(NULL, 27568, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x4005e000
3350 madvise(0x4005e000, 27568, MADV_SEQUENTIAL|0x1) = 0
3350 old_mmap(0x40064000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x5000) = 0x40064000
3350 close(3) = 0
3350 open("/lib/libncurses.so.5", O_RDONLY) = 3
3350 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360\362"..., 512) =
512
3350 fstat64(3, {st_mode=S_IFREG|0755, st_size=316468, ...}) = 0
3350 old_mmap(NULL, 280780, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x40065000
3350 madvise(0x40065000, 280780, MADV_SEQUENTIAL|0x1) = 0
3350 old_mmap(0x4009e000, 45056, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x38000) = 0x4009e000
3350 old_mmap(0x400a9000, 2252, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400a9000
3350 close(3) = 0
3350 open("/lib/libdl.so.2", O_RDONLY) = 3
3350 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\33\0\000"..., 512) =
512
3350 fstat64(3, {st_mode=S_IFREG|0755, st_size=13647, ...}) = 0
3350 old_mmap(NULL, 8628, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x400aa000
3350 madvise(0x400aa000, 8628, MADV_SEQUENTIAL|0x1) = 0
3350 old_mmap(0x400ac000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x400ac000
3350 close(3) = 0
3350 open("/lib/tls/libc.so.6", O_RDONLY) = 3
3350 read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@S\1\000"..., 512) =
512
3350 fstat64(3, {st_mode=S_IFREG|0755, st_size=1345545, ...}) = 0
3350 old_mmap(NULL, 1128748, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x400ad000
3350 madvise(0x400ad000, 1128748, MADV_SEQUENTIAL|0x1) = 0
3350 old_mmap(0x401b6000, 32768, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED, 3, 0x109000) = 0x401b6000
3350 old_mmap(0x401be000, 10540, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x401be000
3350 close(3) = 0
3350 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x401c1000
3350 set_thread_area({entry_number:-1 -> 6, base_addr:0x401c1640,
limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,
limit_in_pages:1, seg_not_present:0, useable:1}) = 0
3350 munmap(0x40018000, 106111) = 0
3350 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
3350 open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
3350 close(3) = 0
3350 brk(0) = 0x80bb000
3350 brk(0x80dc000) = 0x80dc000
3350 brk(0) = 0x80dc000
3350 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = -1
ENOENT (No such file or directory)
3350 open("/usr/share/locale/locale.alias", O_RDONLY) = 3
3350 fstat64(3, {st_mode=S_IFREG|0644, st_size=2528, ...}) = 0
3350 mmap2(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000
3350 read(3, "# Locale name alias data base.\n#"..., 4096) = 2528
3350 read(3, "", 4096) = 0
3350 close(3) = 0
3350 munmap(0x40018000, 4096) = 0
3350 open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY) =
-1 ENOENT (No such file or directory)
3350 open("/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION", O_RDONLY) =
3
3350 fstat64(3, {st_mode=S_IFREG|0644, st_size=365, ...}) = 0
3350 mmap2(NULL, 365, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
3350 close(3) = 0
3350 open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3
3350 fstat64(3, {st_mode=S_IFREG|0644, st_size=21512, ...}) = 0
3350 mmap2(NULL, 21512, PROT_READ, MAP_SHARED, 3, 0) = 0x40019000
3350 close(3) =
.
- Prev by Date: Money most newly in addition kind of usage
- Next by Date: oracle 7.2.2.3.0 on linux
- Previous by thread: Money most newly in addition kind of usage
- Next by thread: oracle 7.2.2.3.0 on linux
- Index(es):
Relevant Pages
|