Unix Shell background processing


 
Thread Tools Search this Thread
Top Forums Programming Unix Shell background processing
# 8  
Old 09-27-2010
Please read my reply to you. "strcmp" doesn't do what you think it does.
This User Gave Thanks to Corona688 For This Post:
# 9  
Old 09-27-2010
Quote:
Originally Posted by Corona688
Please read my reply to you. "strcmp" doesn't do what you think it does.

It's working? however?
I mean..the bool return is changing correctly when an & is found?
Im not saying it's the best thing to be using....but for a shell such as this (being extremely simple) it's only meant for maybe 5 to 6 string characters on a line.


but about the background process. I saw another thread here Background processes in a dummy shell...
that was almost the exact same thing, so maybe I could modify my while(cmd[0] != NULL) loop to do this? or my execute function?
# 10  
Old 09-27-2010
Quote:
Originally Posted by Mercfh
It's working? however?
I mean..the bool return is changing correctly when an & is found?
...I keep forgetting the strtok. Yes, it would.
Quote:
but about the background process.
That's simple enough. To run things without waiting for them, don't wait for them.
Code:
void Execute(int background, char* cmd[])
{
    pid_t pid;
    pid = fork();
    switch(pid)
    {
        case -1:  
            cout << "DEBUG:Fork Failure" << endl;
            exit(-1);
        case  0:
            execvp(cmd[0], cmd);
            
            if(execvp(cmd[0], cmd) == -1)
            {
                cout << "Command Not Found" << endl;
                exit(0);
            }
   
        default:
            if(background == 0)
            {
                    wait(NULL);
                    cout << "DEBUG:Child Finished" << endl;
            }
    }
    
}

...which will work, but leave zombie processes around until your shell quits. You should set up a SIGCHLD handler to handle them as they quit so you don't have to wait() for them.
This User Gave Thanks to Corona688 For This Post:
# 11  
Old 09-27-2010
Ya I had heard about the zombie process thing, altho i'll prolly do that in my "prettying" up after im done with it all. Since im also sure using SIGCHLD is probably a decent addition, especially since i've never used it before.
Funny however I had the idea for the Switch statement just not waiting, and had it......but for some reason I thought it wouldn't work.

Last edited by Mercfh; 09-28-2010 at 06:58 PM..
# 12  
Old 09-27-2010
Quote:
Originally Posted by Mercfh
How can I tell if this is working (i mean i'll take your word for it)......but just curious.
Try running a 'sleep 60 &' then a 'ls'. If it works, it won't wait a full minute for the sleep to finish before running ls.
Quote:
Dont I need the children to spawn like grandchildren?
Nope. You've already created a child with fork(). Fork clones a process, creating an independent copy that's almost identical except for fork()'s return value. Your identical copy goes and does what it wants while your main one does what it wants -- that is, your copy replaces itself with a command via exec, while your main program waits for it to finish.
Quote:
maybe im not exactly sure how background processing is working in this aspect.
The point is, it was in the background all along. The only reason it waits is because you call wait().

Last edited by Corona688; 09-27-2010 at 07:58 PM..
This User Gave Thanks to Corona688 For This Post:
# 13  
Old 09-27-2010
Oh well I guess I just thought there was more to background.
Code:
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stdlib.h> 

using namespace std;

bool ParseArg(char* cmnd, char* cmd[], char input[],bool BG)
{
		
        cout << "myshell> ";
        cin.getline(input,50);
	cmnd = strtok(input, " ");
	int i = 0;

	while(cmnd != NULL)
	{
	    
	    cmd[i] = cmnd;
	    if(strcmp(cmd[i], "&") == 0){
//Debug	    cout << "& found";
	    cmd[i] = NULL;
	    return true;
	}
	    
//Debug	    cout << cmd[i] << " ";
	    i++;
	    cmnd = strtok(NULL, " ");
	}
	return false;
}

void Clean(char* cmd[])
{
//Clean Array
        for(int a=0; a < 40; a++)
        {
             cmd[a] = NULL;
        }
}

void Execute(char* cmd[],bool BG)
{
    pid_t pid;
    pid = fork();
    switch(pid)
    {
        case -1:  
            cout << "DEBUG:Fork Failure" << endl;
            exit(-1);
        case  0:
            execvp(cmd[0], cmd);
            
            if(execvp(cmd[0], cmd) == -1)
            {
                cout << "Command Not Found" << endl;
                exit(0);
            }
   
          default:
            if(BG == 0)
            {
                    wait(NULL);
                    cout << "DEBUG:Child Finished" << endl;
            }

    }
    
}

int main()
{
   char* cmnd;
   char* cmd[40];
   char input[50]; 
   bool BG = false;

	

   while(cmd[0] != NULL)
   {
    	Clean(cmd);
   	BG = ParseArg(cmnd, cmd, input, BG);
	cout << BG;
   	if(strcmp(cmd[0], "exit") == 0 || strcmp(cmd[0], "quit") == 0 )
   	{
             break;
   	}
	else
	{
            Execute(cmd,BG);
	}
	
   }

   return 1;

}

Thats my final code. I tested it.

here's my output, see if it "seems" right.
myshell> ls -l
total 36
-rwxr-xr-x 1 matt matt 8435 2010-09-26 20:43 a.out
-rw-r--r-- 1 matt matt 943 2010-09-26 20:44 fork.c
drwxr-xr-x 2 matt matt 4096 2010-09-27 02:13 Hello
-rwxr-xr-x 1 matt matt 8293 2010-09-27 18:50 shell
-rw-r--r-- 1 matt matt 1650 2010-09-27 18:50 shell.c
0DEBUG:Child Finished
myshell> ls -l &
1myshell> total 36
-rwxr-xr-x 1 matt matt 8435 2010-09-26 20:43 a.out
-rw-r--r-- 1 matt matt 943 2010-09-26 20:44 fork.c
drwxr-xr-x 2 matt matt 4096 2010-09-27 02:13 Hello
-rwxr-xr-x 1 matt matt 8293 2010-09-27 18:50 shell
-rw-r--r-- 1 matt matt 1650 2010-09-27 18:50 shell.c
ls -a
0DEBUG:Child Finished
myshell> . .. a.out fork.c Hello .hi shell shell.c



From what I can tell, when I call the & it doesn't wait for the myshell> to come back up, and just lets you call another command anyways. So it "seems" right.
Also I did the sleep 60 &, and it let me call ls right after, as opposed to without the & it had to wait. My only little issue "maybe" with it, is that after you call & once, the myshell>
doesn't come back up....although it still lets me type in commands. So I thought "well maybe it's treating them ALL as background processes"......but it's not, because I tried the sleep 60 thing after I had typed in an ls & previously and it made me wait 60 seconds..........so? I think it may just be a problem with the myshell> printout thing, altho im not sure what it is.


BTW, totally off topic, but is there any reason cd (change dir.) doesn't ever work on any of these "sample shells" i've seen around (when I was looking for help with mine, i looked at a ton of examples and tried a ton of them) is their something special about cd?

Last edited by Mercfh; 09-27-2010 at 08:10 PM..
# 14  
Old 09-27-2010
Quote:
Originally Posted by Mercfh
BTW, totally off topic, but is there any reason cd (change dir.) doesn't ever work on any of these "sample shells" i've seen around (when I was looking for help with mine, i looked at a ton of examples and tried a ton of them) is their something special about cd?
Seems quite on-topic to me.

cd is special because it's not a command you run, it's the system call chdir(), and it has to be done inside the shell itself, not in a forked copy. Remember that the forked copy is independent. If you chdir inside it, your original shell still remains where it is, defeating the point!

So the shell has to handle cd itself, feeding its parameters into the chdir() call directly, not forking anything.
This User Gave Thanks to Corona688 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to log file processing details to database table usnig UNIX shell script?

we are getting files on daily basis.we need to process these files. i need a unix shell script where we can count 1-The no of files processed 2-No of data/record processed for each files. The script should log these details into a database table. If there is any error while file... (3 Replies)
Discussion started by: Atul kumar
3 Replies

2. Shell Programming and Scripting

How to run multiple functions in Background in UNIX Shell Scripting?

Hi, I am using ksh , i have requirement to run 4 functions in background , 4 functions call are available in a case that case is also in function, i need to execute 1st function it should run in background and return to case and next i will call 2nd function it should run in background and... (8 Replies)
Discussion started by: karthikram
8 Replies

3. Programming

awk processing / Shell Script Processing to remove columns text file

Hello, I extracted a list of files in a directory with the command ls . However this is not my computer, so the ls functionality has been revamped so that it gives the filesizes in front like this : This is the output of ls command : I stored the output in a file filelist 1.1M... (5 Replies)
Discussion started by: ajayram
5 Replies

4. Shell Programming and Scripting

BASH - Handling background processes - distributed processing

NOTE: I am using BASH and Solaris 10 for this. Currently in the process of building a script that has a main "watcher" daemon that reads a configuration file and starts background processes based on it's global configuration. It is basically an infinite loop of configuration reading. Some of the... (4 Replies)
Discussion started by: dcarrion87
4 Replies

5. Shell Programming and Scripting

background processing in BASH

I have script 3 scripts 1 parent (p1) and 2 children child1 and child2 I have script 3 scripts 1 parent 2 children child1 child2 In the code below the 2 child processes fire almost Instantaneously in the background, Is that possible to know the status of pass/fail of each process... (12 Replies)
Discussion started by: jville
12 Replies

6. Linux

background processing in BASH

I have script 3 scripts 1 parent 2 children child1 child2 In the code below the 2 child processes fire almost Instantaneously in the background, Is that possible to know the status of pass/fail of each process "as it happens" ? In the present scenario although Child2... (5 Replies)
Discussion started by: jville
5 Replies

7. Shell Programming and Scripting

run a shell in the background

How can I run a shell in the background? cat test.sh #!/bin/sh sleep 600 Thank u very much indeed! (2 Replies)
Discussion started by: GCTEII
2 Replies

8. Shell Programming and Scripting

Background shell script

I have a friend at work that asked me a question today and I figured I would seek help here. How does a shell script know whether it is running in the background or not? Thanks in advance for help (5 Replies)
Discussion started by: Moofasa
5 Replies

9. UNIX Desktop Questions & Answers

Unix Background

Hi, I'm new to this forums and to Unix OS... Is this the right place to put this thread? I just need to ask how to set the wallpaper that goes through the x-term windows in a Unix system? It's as if the x-term windows is transparent... I tried modifying the .login file and things got... (5 Replies)
Discussion started by: Gri3v3r7
5 Replies

10. UNIX for Dummies Questions & Answers

background for unix

Hi, I am a newbie learing Unix , I have started with teh book "the Design of the Unix OS" by Bach.After which I plan to read "UNIX Network Programming" by Richard Stevens. What is the background that one needs to learn unix. I know C. But I am not sure about my Operating Systems... (4 Replies)
Discussion started by: ramyar
4 Replies
Login or Register to Ask a Question