LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
Search this Thread
Old 05-31-2004, 05:45 AM   #1
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Rep: Reputation: 15
problem with adding a system call


Hello all,

I am new here and tried to add 4 system call to my kernel on redhat 9.

This is what I did :

In /usr/src/linux-2.4/include/linux/wait.h, I added

struct evnt_queue
{
struct evnt_queue *next_event;
wait_queue_head_t waitq;
int eid;
};

In /usr/src/linux-2.4/arch/i386/kernel/entry.S I added
.long SYMBOL_NAME(sys_evntopen)
.long SYMBOL_NAME(sys_evntclose) /* 260 */
.long SYMBOL_NAME(sys_evntwait)
.long SYMBOL_NAME(sys_evntsig)

In /usr/src/linux-2.4/include/asm/unistd.h I added

#define __NR_evntopen 259
#define __NR_evntclose 260
#define __NR_evntwait 261
#define __NR_evntsig 262

In /usr/src/linux-2.4/init/main.c I added

struct evnt_queue *eq;

static void __init event_init(void)
{
eq=(struct evnt_queue *)kmalloc(
sizeof(struct evnt_queue), GFP_KERNEL);
eq->next_event=NULL;
eq->eid=0;
init_waitqueue_head(&(eq->waitq));
}
asmlinkage void __init start_kernel(void)
{
......
event_init(); /* last statement */
}


In /usr/src/linux/kernel/sys.c : I add the code of the new system call
asmlinkage int sys_eventopen(int eid)
{
int newid=-1;
struct event_queue *temp;

printk("sys_eventopen");
if (eq==NULL)
{
eq=(struct event_queue *)kmalloc(
sizeof(struct event_queue), GFP_KERNEL);
eq->next_event=NULL;
eq->eid=0;
init_waitqueue_head(&(eq->waitq));
}

temp=eq->next_event;
if (eid>0)
{
while ((temp!=NULL)&&(temp->eid!=eid))
{
temp=temp->next_event;
}
if ((temp!=NULL)&&(temp->eid==eid)) newid=eid;
}
else if (eid==0)
{
while (temp!=NULL)
{
if (newid<temp->eid) newid=temp->eid;
temp=temp->next_event;
}
newid++;
if (newid<1) newid=1;
temp=(struct event_queue *)kmalloc(
sizeof(struct event_queue), GFP_KERNEL);
if (temp==NULL) newid=-1;
else
{
temp->eid=newid;
temp->next_event=eq->next_event;
eq->next_event=temp;
init_waitqueue_head(&(temp->waitq));
}
}

return(newid);
}

asmlinkage int sys_eventclose(int eid)
{
int result=-1;
struct event_queue *prev, *temp;

printk("sys_eventclose");
prev=eq;
temp=prev->next_event;
while ((temp!=NULL)&&(temp->eid!=eid))
{
prev=temp;
temp=prev->next_event;
}

if ((temp!=NULL)&&(waitqueue_active(&(temp->waitq))))
wake_up_interruptible(&(temp->waitq));
if (temp!=NULL)
{
result=0;
prev->next_event=temp->next_event;
kfree(temp);
}

return(result);
}

asmlinkage int sys_eventwait(int eid)
{

int result=-1;
struct event_queue *temp;

printk("sys_eventwait");
temp=eq->next_event;
while ((temp!=NULL)&&(temp->eid!=eid))
{
temp=temp->next_event;
}

if (temp!=NULL)
{
result=0;
interruptible_sleep_on(&(temp->waitq));
}

return(result);
}

asmlinkage int sys_eventsig(int eid)
{

int result=-1;
struct event_queue *temp;

printk("sys_eventsig");
temp=eq->next_event;
while ((temp!=NULL)&&(temp->eid!=eid))
{
temp=temp->next_event;
}

if (temp!=NULL)
{
result=0;
wake_up_interruptible(&(temp->waitq));
}

return(result);
}


And this is the test programm which use the system call :

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <linux/unistd.h>
#include <linux/wait.h>


_syscall1(int, eventopen, int, eid);
_syscall1(int, eventclose, int, eid);
_syscall1(int, eventwait, int, eid);
_syscall1(int, eventsig, int, eid);


void *task_wait(void *eid) /* eventwait */
{
printf("event %d waiting\n", eid);
eventwait((int)eid);
printf("event %d waked up\n", eid);
}


void *task_signal(void *eid) /* eventsig */
{
printf("event %d signaling\n", eid);
eventsig((int)eid);
}


int main(int arg, char ** argv)
{
int i, k, n;
int eids[10];
pthread_t tasks[10];

n=3; /* open 3 threads */

for (i=0; i<n; i++)
{
eids[i]=eventopen(0); /* open events */
if (eids[i]>0) printf("event %d opened\n", eids[i]);
else printf("event #%d could not open\n", i);
}

for (i=0; i<n; i++)
{
/* creat threads */
pthread_create(&tasks[i], NULL, task_wait, (void *)eids[i]);
sleep(2);
}

for (i=n-1; i>=0; i--)
{
pthread_create(&tasks[i], NULL, task_signal, (void *)eids[i]);
sleep(2);
}

for (i=0; i<n; i++)
{
k=eventclose(eids[i]); /* test eventclose */
if (k==0) printf("event %d closed\n", eids[i]);
else printf("event %d could not close\n", eids[i]);
}

for (i=0; i<n; i++)
{
pthread_join(tasks[i], NULL);
}

return(0);
}

Everything seems to be OK but when I try to run the test program only
sys_eventopen was called and printed in the log file.

Could anyone help me ?

Thanks a lot

newcat
 
Old 05-31-2004, 12:05 PM   #2
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
here's a dumb question, are you sure that event_close is being called? and tahnks for the inspiration, that looks like fun im going to try it later 2nite
 
Old 05-31-2004, 01:27 PM   #3
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
In my log file (/var/log/message) only sys_eventopen was printed. sys_eventclose, sys_eventsig, sys_eventwait were not printed in the log file:

"May 30 01:57:10 localhost kernel: sys_eventopen
May 30 01:57:10 localhost kernel: last message repeated 2 times"

Thanks,

newcat
 
Old 05-31-2004, 03:01 PM   #4
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
no i mean in main(), in your actual program. are u familiar with the strace utility? i would try using that to see what's going on
 
Old 05-31-2004, 04:59 PM   #5
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
The output of the program is:

"event 1 opened
event 2 opened
event 3 opened
event 1 waiting
event 1 waked up
event 2 waiting
event 2 waked up
event 3 waiting
event 3 waked up
event 3 signaling
event 2 signaling
event 1 signaling
event 1 could not close
event 2 could not close
event 3 could not close"

I will try to use strace utility.

Thanks,

newcat
 
Old 05-31-2004, 06:24 PM   #6
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
I used strace and find out that:

sys_eventopen works fine.

"open("etc/ld.so.preload",O_READONLY)=-1 ENOENT (No such file or directory)"

sys_eventwait and sys_eventsig are not even called.

sys_eventclose gets error:

"SYS_260(ox2, 0x40032280, 0, 0x40015360, 0x80487a0) = -1
ENOSYS(Function not implemented)"
 
Old 05-31-2004, 08:06 PM   #7
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
i donno.. maybe there is an upper limit on # of system calls? im going to mess /w this tonight,. u read this: http://www.uni-tuebingen.de/zdv/proj...tion2_6_4.html

Last edited by infamous41md; 05-31-2004 at 08:11 PM.
 
Old 05-31-2004, 09:36 PM   #8
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
The system calls in sys.c and main should be sys_evntopen, sys_evntclose, sys_evntwait and sys_evntsig rather than sys_eventopen, sys_eventclose, sys_eventwait and sys_eventsig. I posted earlier by mistake.

Also, here is the strace log in case you might want to have a look:

a. strace log with -c option:

execve("./a.out", ["./a.out"], [/* 33 vars */]) = 0
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
38.62 0.000509 85 6 write
23.14 0.000305 102 3 SYS_259
6.45 0.000085 14 6 clone
5.69 0.000075 11 7 mmap2
4.78 0.000063 16 4 1 open
4.78 0.000063 7 9 old_mmap
3.41 0.000045 8 6 mprotect
3.11 0.000041 3 13 rt_sigprocmask
1.97 0.000026 13 2 munmap
1.52 0.000020 3 7 rt_sigaction
1.44 0.000019 5 4 fstat64
1.37 0.000018 9 2 read
1.21 0.000016 3 5 brk
0.53 0.000007 2 3 close
0.46 0.000006 6 1 uname
0.46 0.000006 1 6 nanosleep
0.38 0.000005 5 1 set_thread_area
0.38 0.000005 2 3 3 SYS_260
0.15 0.000002 2 1 getrlimit
0.15 0.000002 2 1 set_tid_address
------ ----------- ----------- --------- --------- ----------------
100.00 0.001318 90 4 total

b. strace log with no option:

execve("./a.out", ["./a.out"], [/* 33 vars */]) = 0
uname({sys="Linux", node="localhost.localdomain", ...}) = 0
brk(0) = 0x80499cc
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=53695, ...}) = 0
old_mmap(NULL, 53695, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
close(3) = 0
open("/lib/tls/libpthread.so.0", O_RDONLY) = 3
read(3, " \177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\32
0>\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=79744, ...}) = 0
old_mmap(NULL, 50040, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40025000
old_mmap(0x4002f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xa000) = 0x4002f000
old_mmap(0x40030000, 4984, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40030000
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
read(3, " \177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`V\
1B4\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1531064, ...}) = 0
old_mmap(0x42000000, 1257224, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x42000000
old_mmap(0x4212e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x12e000) = 0x4212e000
old_mmap(0x42131000, 7944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42131000
close(3) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40032000
set_thread_area({entry_number:-1 -> 6, base_addr:0x40032280, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0x40017000, 53695) = 0
set_tid_address(0x400322c8) = 3572
rt_sigaction(SIGRTMIN, {0x40028e30, [], SA_RESTORER, 0x4002e618}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], NULL, 8) = 0
getrlimit(0x3, 0xbfffde84) = 0
SYS_259(0, 0x42015554, 0x40032468, 0x40015360, 0x80487a0) = 1
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
write(1, "event 1 opened\n", 15) = 15
SYS_259(0, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 2
write(1, "event 2 opened\n", 15) = 15
SYS_259(0, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 3
write(1, "event 3 opened\n", 15) = 15
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40033000
brk(0) = 0x80499cc
brk(0x804a9cc) = 0x804a9cc
brk(0) = 0x804a9cc
brk(0x804b000) = 0x804b000
mprotect(0x40033000, 4096, PROT_NONE) = 0
clone(child_stack=0x408328d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3573], {entry_number:6, base_addr:0x40832cc0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3573
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40833000
mprotect(0x40833000, 4096, PROT_NONE) = 0
clone(child_stack=0x41032850, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3574], {entry_number:6, base_addr:0x41032c40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3574
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x41033000
mprotect(0x41033000, 4096, PROT_NONE) = 0
clone(child_stack=0x418327d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3575], {entry_number:6, base_addr:0x41832bc0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3575
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x42133000
mprotect(0x42133000, 4096, PROT_NONE) = 0
clone(child_stack=0x42932750, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3576], {entry_number:6, base_addr:0x42932b40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3576
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x42933000
mprotect(0x42933000, 4096, PROT_NONE) = 0
clone(child_stack=0x431326d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3577], {entry_number:6, base_addr:0x43132ac0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3577
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x43133000
mprotect(0x43133000, 4096, PROT_NONE) = 0
clone(child_stack=0x43932650, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|
CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON
E_CHILD_CLEARTID|CLONE_DETACHED, [3578], {entry_number:6, base_addr:0x43932a40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3578
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
SYS_260(0x1, 0x40032280, 0, 0x40015360, 0x80487a0) = -1 ENOSYS (Function not implemented)
write(1, "event 1 could not close\n", 24) = 24
SYS_260(0x2, 0x40032280, 0x18, 0x40015360, 0x80487a0) = -1 ENOSYS (Function not implemented)
write(1, "event 2 could not close\n", 24) = 24
SYS_260(0x3, 0x40032280, 0x18, 0x40015360, 0x80487a0) = -1 ENOSYS (Function not implemented)
write(1, "event 3 could not close\n", 24) = 24
munmap(0x40017000, 4096) = 0
exit_group(0) = ?

thanks,
 
Old 05-31-2004, 11:08 PM   #9
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
Quote:
Originally posted by newcat

SYS_260(0x1, 0x40032280, 0, 0x40015360, 0x80487a0) = -1 ENOSYS (Function not implemented)
AHA! i think i figured it out:
u need to redefine this define to higher number
Code:
#ifndef NR_syscalls
#define NR_syscalls 256
#else

ENTRY(system_call)
    pushl %eax          # save orig_eax
    SAVE_ALL 
    GET_CURRENT(%ebx)
    testb $0x02,tsk_ptrace(%ebx)    # PT_TRACESYS
    jne tracesys
    cmpl $(NR_syscalls),%eax
    jae badsys      
...

badsys:
    movl $-ENOSYS,EAX(%esp) 
    jmp ret_from_sys_call
doncha jus love strace, it knows all

Last edited by infamous41md; 05-31-2004 at 11:11 PM.
 
Old 05-31-2004, 11:12 PM   #10
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
and i think that originally constant is defined here:
/include/linux/sys.h , but just to be sure u should change it in both files.
 
Old 06-01-2004, 01:11 AM   #11
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
Infamous41md,

You are so great!!!

I changed the constant in /include/linux/sys.h and it works now!!!

The messages in /var/log/messages show that all of the 4 system calls were called. But I don't understand why strace.log only show that sys_evntopen (SYS_259) and sys_evntclose(SYS_260) were called.

Here is the new strace log:

execve("./a.out", ["./a.out"], [/* 33 vars */]) = 0
uname({sys="Linux", node="localhost.localdomain", ...}) = 0
brk(0) = 0x80499cc
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=53695, ...}) = 0
old_mmap(NULL, 53695, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
close(3) = 0
open("/lib/tls/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320>\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=79744, ...}) = 0
old_mmap(NULL, 50040, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40025000
old_mmap(0x4002f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xa000) = 0x4002f000
old_mmap(0x40030000, 4984, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40030000
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`V\1B4\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1531064, ...}) = 0
old_mmap(0x42000000, 1257224, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x42000000
old_mmap(0x4212e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x12e000) = 0x4212e000
old_mmap(0x42131000, 7944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42131000
close(3) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40032000
set_thread_area({entry_number:-1 -> 6, base_addr:0x40032280, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0x40017000, 53695) = 0
set_tid_address(0x400322c8) = 3575
rt_sigaction(SIGRTMIN, {0x40028e30, [], SA_RESTORER, 0x4002e618}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], NULL, 8) = 0
getrlimit(0x3, 0xbfffe484) = 0
SYS_259(0, 0x42015554, 0x40032468, 0x40015360, 0x80487a0) = 1
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
write(1, "event 1 opened\n", 15) = 15
SYS_259(0, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 2
write(1, "event 2 opened\n", 15) = 15
SYS_259(0, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 3
write(1, "event 3 opened\n", 15) = 15
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40033000
brk(0) = 0x80499cc
brk(0x804a9cc) = 0x804a9cc
brk(0) = 0x804a9cc
brk(0x804b000) = 0x804b000
mprotect(0x40033000, 4096, PROT_NONE) = 0
clone(child_stack=0x408328d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3576], {entry_number:6, base_addr:0x40832cc0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3576
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40833000
mprotect(0x40833000, 4096, PROT_NONE) = 0
clone(child_stack=0x41032850, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3577], {entry_number:6, base_addr:0x41032c40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3577
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x41033000
mprotect(0x41033000, 4096, PROT_NONE) = 0
clone(child_stack=0x418327d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3578], {entry_number:6, base_addr:0x41832bc0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3578
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x42133000
mprotect(0x42133000, 4096, PROT_NONE) = 0
clone(child_stack=0x42932750, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3579], {entry_number:6, base_addr:0x42932b40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3579
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x42933000
mprotect(0x42933000, 4096, PROT_NONE) = 0
clone(child_stack=0x431326d0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3580], {entry_number:6, base_addr:0x43132ac0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3580
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x43133000
mprotect(0x43133000, 4096, PROT_NONE) = 0
clone(child_stack=0x43932650, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SETTLS|CLONE_PARENT_SETTID|CLON E_CHILD_CLEARTID|CLONE_DETACHED, [3581], {entry_number:6, base_addr:0x43932a40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 3581
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, {2, 0}) = 0
SYS_260(0x1, 0x40032280, 0, 0x40015360, 0x80487a0) = 0
write(1, "event 1 closed\n", 15) = 15
SYS_260(0x2, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 0
write(1, "event 2 closed\n", 15) = 15
SYS_260(0x3, 0x40032280, 0xf, 0x40015360, 0x80487a0) = 0
write(1, "event 3 closed\n", 15) = 15
munmap(0x40017000, 4096) = 0
exit_group(0) = ?
 
Old 06-01-2004, 01:00 PM   #12
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
aweseome! i still haven't been able to try this myself yet b/c i've had a project im working on for $$, but i can't wait once im done as to problem, i donno, but it doesnt look like ur threads are even running, does it? i dont see the printf(..) in your threads output??
 
Old 06-01-2004, 02:04 PM   #13
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
The strange thing is though the threads were not shown in the strace log, they were shown both in the program output and messages file:

program output:

[root@localhost project1]# gcc -I/usr/src/linux-2.4.20-8/include test.c -lpthread
[root@localhost project1]# strace -o strace2.log ./a.out
event 1 opened
event 2 opened
event 3 opened
event 1 waiting
event 2 waiting
event 3 waiting
event 3 signaling
event 3 waked up
event 2 signaling
event 2 waked up
event 1 signaling
event 1 waked up
event 1 closed
event 2 closed
event 3 closed

[root@localhost project1]#cd /var/log
[root@localhost log]# more messages
...
May 31 22:10:23 localhost kernel:sys_evntopen
May 31 22:10:23 localhost last message repeated 2 times
May 31 22:10:23 localhost kernel:sys_evntwait
May 31 22:10:27 localhost last message repeated 2 times
May 31 22:10:29 localhost kernel:sys_evntsig
May 31 22:10:33 localhost last message repeated 2 times
May 31 22:10:35 localhost kernel:sys_evntclose
May 31 22:10:39 localhost last message repeated 2 times


I must leave to show my professor the work. ^-^ Let me know once you figure the problem out.

Thanks,
 
Old 06-01-2004, 03:20 PM   #14
infamous41md
Member
 
Registered: Mar 2003
Posts: 804

Rep: Reputation: 30
check out strace man page, optins for following child/threads. 'strace -f' of mine.
 
Old 06-02-2004, 02:02 AM   #15
newcat
LQ Newbie
 
Registered: May 2004
Location: USA
Posts: 28

Original Poster
Rep: Reputation: 15
Ya, you are right. Thank you for your help. Now I have time to play some kpoker. ^-^
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Adding a system call to SuSE Linux khcm8jw Linux - Newbie 3 10-23-2005 04:36 AM
Adding system call in linux guam Programming 2 12-04-2004 01:38 PM
Adding system call dumb82 Linux - Newbie 0 07-20-2004 02:25 AM
Adding new System Call to Kernel kurt_ram Linux - General 1 10-22-2002 03:59 PM
adding system call in linux udayan Programming 1 05-02-2002 03:26 AM


All times are GMT -5. The time now is 10:01 PM.

Main Menu
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration