Visit Our UNIX and Linux User Community


Help with task daemon


 
Thread Tools Search this Thread
Top Forums Programming Help with task daemon
# 1  
Old 04-08-2009
Help with task daemon

believe it or not but this is my first c program (i've worked with java, C#, php though) I am trying to make a daemon that checks if mplayer is running(it's for a projection room) and if it is not then to run mplayer with a file.. So far it's not working and I don't know why

Help and comments would be appreciated
Code:
#include <sys/types.h>  /* include this before any other sys headers */ 
#include <sys/wait.h>   /* header for waitpid() and various macros */ 
#include <signal.h>     /* header for signal functions */ 
#include <stdio.h>      /* header for fprintf() */ 
#include <unistd.h>     /* header for fork() */ 
 
void  ChildProcess(void);                /* child process prototype  */ 
void  ParentProcess(void);               /* parent process prototype */
 
int  main(void) 
{     pid_t pid;

    while(1){ 
            int rc;
            rc<<system("ps ux | awk '/mplayer/ && !/awk/ {print $2}'"); 
          rc = WEXITSTATUS(rc); /* Check if mplayer is running */ 
       if(rc >= 0 ){ 
              pid = fork(); 
              if(pid>=0){     
                if (pid == 0)  
                 ChildProcess(); 
                else  
                 ParentProcess(); 
                } 
              } 
       else 
          {/*fork error*/}
   
     }
return (0); 
} 
 
void  ChildProcess(void) 
{ 
     execvp("mplayer ~/test.avi",NULL); 
     exit(0); 
} 
 
void  ParentProcess(void) 
{ 
    sleep(2); 
    return; 
}

# 2  
Old 04-08-2009
Quote:
Originally Posted by james2432
believe it or not but this is my first c program
I do
Quote:
Originally Posted by james2432
I am trying to make a daemon that checks if mplayer is running (it's for a projection room) and if it is not then to run mplayer with a file..
Not exactly what a daemon is for IMO, but that's not for here to discuss
Quote:
Originally Posted by james2432
So far it's not working and I don't know why
What exactly isn't working. I found a few things that might cause problems, but that could or couldn't be what you're looking for.
Code:
#include <sys/types.h>  /* include this before any other sys headers */ 
#include <sys/wait.h>   /* header for waitpid() and various macros */ 
#include <signal.h>     /* header for signal functions */ 
#include <stdio.h>      /* header for fprintf() */ 
#include <unistd.h>     /* header for fork() */ 
 
void  ChildProcess(void);                /* child process prototype  */ 
void  ParentProcess(void);               /* parent process prototype */
 
int  main(void) 
{     pid_t pid;

    while(1){ 
            int rc;
            // I don't think this is standard C behaviour, execpt if you want to
            // bit-shift left an uninitialized variable
            rc<<system("ps ux | awk '/mplayer/ && !/awk/ {print $2}'"); 
            [color=blue]// Where did that come from?
          rc = WEXITSTATUS(rc); /* Check if mplayer is running */ 
       if(rc >= 0 ){ 
              pid = fork();
              if(pid>=0){     
                if (pid == 0)  
                 ChildProcess(); 
                else  
                 ParentProcess(); 
                } 
              } 
       else 
          {/*fork error*/}
   
     }
return (0); 
} 
 
void  ChildProcess(void) 
{ 
     execvp("mplayer ~/test.avi",NULL); 
     exit(0); 
} 
 
void  ParentProcess(void) 
{ 
    sleep(2); 
    return; 
}

As a guideline, a daemon usually has this workflow:
Code:
initialize
pid=fork
if(pid==0)
    exit //parent
else
    while(1)
        do something

Your code, OTOH, never goes into background, and, in case mplayer keeps on crashing, will waste quite some time on process creation.
In your ChildProcess() function you could replace the execvp/exit combination with a simple exec, as this will replace the current process image (that of the child) with that of the program you're specifying.
# 3  
Old 04-08-2009
Code:
while(1){ 
            int rc;
            rc=system("ps ux | awk '/mplayer/ && !/awk/ {print $2}'"); 
          rc = WEXITSTATUS(rc); /* Check if mplayer is running */ 
       if(rc > 0 ){
              printf("i was here");
                 printf(rc); 
              pid = fork(); 
              if(pid>=0){     
                if (pid == 0)  
                 ChildProcess(); 
                else  
                 ParentProcess(); 
                } 
              }

It never gets to "i was here"
i'm trying to get the process ID so I can check if it is running then relaunch it...right now it just doesn't launch anything. and for the daemon part, I am aware that it's not reall daemonesk but I want to be able to stop it
# 4  
Old 04-08-2009
Code:
while(1){ 
            int rc;
            rc=system("ps ux | awk '/mplayer/ && !/awk/ {print $2}'"); 
          rc = WEXITSTATUS(rc); /* Check if mplayer is running */
            printf("I was here pid: %s\n",rc);

the output is always : I was here pid: (null)

*edit*
I was trying to fallow the example here:
http://joekuan.wordpress.com/2009/02...he-ps-command/

Last edited by james2432; 04-09-2009 at 12:48 AM..
# 5  
Old 04-09-2009
From the man-page of wait(2) (where WEXITSTATUS() is explained):
Quote:
WEXITSTATUS(status)
returns the exit status of the child. This consists of the least significant 16-8 bits of the status argument that the child specified in a call to exit() or _exit() or as the argument for a return statement in main(). This macro should only be employed if WIFEXITED returned true.
And I guess using %d instead of %s would be better in the printf statement, as it's an int, not a char*.
# 6  
Old 04-09-2009
Thanks for the help i was tired(i program all day long) and facepalmed when you mentioned the %d for decimal... i should have known

everything is sort of working mplayer never quits now :P
Code:
    while(1){ 
          int rc=system("ps -C mplayer -opid=");
                 
          rc = WEXITSTATUS(rc); /* Check if mplayer is running */
            printf("I was here pid: %d\n",rc); 
       if(rc > 0 ){
               
              pid = fork(); 
              if(pid>=0){     
                if (pid == 0)  
                 ChildProcess(); 
                else  
                 ParentProcess(); 
                } 
              } 
       else 
          {/*fork error*/}
   
     }
return (0); 
} 
 
void  ChildProcess(void) 
{ 
     system("mplayer ~/test.avi"); 
     exit(0); 
} 
 
void  ParentProcess(void) 
{ 
    sleep(2); 
    return; 
}


Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Task 1 bible

Hi i have recently started learning Bash scripting to learn a new skill. My boss has assigned me a task but i am struggling to complete it would really be thankful for some help ill put what i have so far: Test1-bible is the directory and each chapter of the bible is a sub-directory hence i... (1 Reply)
Discussion started by: Atreus20
1 Replies

2. Homework & Coursework Questions

[HELP] Easy task

I have a simple task for my school work. I'm new with unix, so i need help. I need to write a scenario. Task is. From created txt file read first 3 words and create a 3 catalogs with those 3 words. 2 of those new catalogs should be transferred to other directory. If someone could help me just... (1 Reply)
Discussion started by: justynykas
1 Replies

3. Shell Programming and Scripting

Parallelize a task that have for

Dear all, I'm a newbie in programming and I would like to know if it is possible to parallelize the script: for l in {1..1000} do cut -f$l quase2 |tr "\n" "," |sed 's/$/\ /g' |sed '/^$/d' >a_$l.t done I tried: for l in {1..1000} do cut -f$l quase2 |tr "\n" "," |sed 's/$/\ /g' |sed... (7 Replies)
Discussion started by: valente
7 Replies

4. Shell Programming and Scripting

Task

Hi experts, I have a problem with the below shell task: I need to modify the file creatin a paired row , per each row which matches filter (e.g. number of nonempty columns = 5) Output should look like this: second row is original one from the input, first row(red) is pairing row, it's... (29 Replies)
Discussion started by: hernand
29 Replies

5. Shell Programming and Scripting

task

Hi all, I'm newbie and stuck here. Thanks for any help. Input(txt file) a b X c d Y e f Z g h W Requested output: a b X Y c d Y X e f Z W g h W Z Please use code tags when posting data and code samples! (10 Replies)
Discussion started by: hernand
10 Replies

6. Shell Programming and Scripting

last task for my script

hi, infile- create table salary ( occupation_code char(40), earnings decimal(10,2), occ_yearend integer ); outfile- salary:create table salary salary:( occupation_code char(40), salary: earnings decimal(10,2), salary: occ_yearend integer salary:); Thanks. (4 Replies)
Discussion started by: dvah
4 Replies

7. Shell Programming and Scripting

Need a help to automate a task

I need to automate a manual task using shell scripting. The scenario is like :- #!/usr/bin/sh echo "please enter the name of the lab server to test ..." read s ssh $s This is peace of the script which will allow me to login to another server using "ssh". I have a conf file which is having... (4 Replies)
Discussion started by: Renjesh
4 Replies

8. Shell Programming and Scripting

Parse an XML task list to create each task.xml file

I have an task definition listing xml file that contains a list of tasks such as <TASKLIST <TASK definition="Completion date" id="Taskname1" Some other <CODE name="Code12" <Parameter pname="Dog" input="5.6" units="feet" etc /Parameter> <Parameter... (3 Replies)
Discussion started by: MissI
3 Replies

9. Shell Programming and Scripting

comment and Uncomment single task out of multiple task

I have a file contains TASK gsnmpproxy { CommandLine = $SMCHOME/bin/gsnmpProxy.exe } TASK gsnmpdbgui { CommandLine = $SMCHOME/bin/gsnmpdbgui.exe I would like to comment and than uncomment specific task eg TASK gsnmpproxy Pls suggest how to do in shell script (9 Replies)
Discussion started by: madhusmita
9 Replies

10. UNIX for Dummies Questions & Answers

process vs task

Hi, I am new to this forum and unix too. I have just started learning unix. As I was going through the first chapter, I read that unix is multitasking, multiprogramming, multiprocessing and multiuser OS. My question is: Is there any difference between a TASK and a PROCESS. How are PROCESS... (2 Replies)
Discussion started by: hana
2 Replies

Featured Tech Videos