11-05-2008
Question using signals in my own shell..
Wasn't really sure where to put this, since I'm using C in UNIX, but I am making my own shell... so, what's going on is this:
For our program, we had to create our own shell, and if the user pressed ctrl-c just at the cmdline, then this signal would be ignored, but if there is a foreground process running, let's say, "sleep 10", and ctrl-c was pressed, then this process would be terminated... however, my problem lies within background processes... when I press ctrl-c after running something like "sleep 10 &", where the '&' indicates it's a background process, it uses the correct if branch of my SIGINT_handler, but it terminates the process.... so it's definitely something wrong with either the handler, or the installation of the signal.
What I don't get is... if the ctrl-c at the command line doesn't quit the program, why would it terminate my background process? Is it because the parent process just puts the ctrl-c onto the child processes? If so, is there a way to add something to my SIGINT_handler to make it ignore this signal?
****Let me just say that I have successfully been able to ignore the signal for a background process, but this way doesn't use my SIGINT_handler, which I do want it to use so some text gets printed. The way I'm talking of is just using "signal(SIGINT, SIG_IGN)", but like I said, doesn't use my SIGINT_handler...
This is my SIGINT_handler:
void SIGINT_handler(int sig)
{
if (foreground_pid == 0)
{
fprintf(stderr, "\nSIGINT ignored\n");
}
else
{
kill(foreground_pid, SIGINT);
foreground_pid = 0;
}
}
And then when I install the handler/signal, I use signal(SIGINT, SIGINT_handler) and also set foreground_pid in its respective spot... so if anyone can help, that'd be awesome, and if you need to see more code or some things are unclear, ask. Thanks.
10 More Discussions You Might Find Interesting
1. Programming
does the way of handling, interrupting signals in HP-UX same as that of solaris. If there is difference than what it is.?:confused: (1 Reply)
Discussion started by: kapilv
1 Replies
2. Programming
:) Hello, i have been given the following code to help me learn how to use signals, it won't compile. The problem maybe because this was written for use in Unix and i am trying to compile in Linux.
The error i get says that SIGPIPE and SIG_IGN are undeclared.
I think that these are defined... (2 Replies)
Discussion started by: theultimatechuf
2 Replies
3. UNIX for Advanced & Expert Users
Using Korn Shell on HP-UX 11.x
Question about signals between two shells. First shell is the parent that kicks off the second shell. The first shell is going to ignore a standard set of signals, but I want the second shell to signal back to its parent if event X happens. Can I do something of... (5 Replies)
Discussion started by: google
5 Replies
4. Programming
Hi all,
Just a little question relative to signals.
I know that if an application is in the sleep state, When a signal is catched, it will be processed by the handler. But what happens if it's processing something? Does the processing stops??
The following code should illustrate this case
... (2 Replies)
Discussion started by: ninjanesto
2 Replies
5. UNIX for Dummies Questions & Answers
Suppose I have a script named "sc.sh"
in the script how to print out its name "sc.sh"? (3 Replies)
Discussion started by: meili100
3 Replies
6. UNIX for Dummies Questions & Answers
(posted this in the scripting forum as well, but figured it should go here) So, what's going on is this:
For our program, we had to create our own shell, and if the user pressed ctrl-c just at the cmdline, then this signal would be ignored, but if there is a foreground process running, let's... (0 Replies)
Discussion started by: blind melon
0 Replies
7. Programming
How can use signals in a C program If i want a child program to signal it's parent program that it(child) program has completed the task that it was assigned.:confused: (2 Replies)
Discussion started by: kapilv
2 Replies
8. Shell Programming and Scripting
Hi all,
I have the c program that c program has to be in sleep mode.
I want write a script the it should trap the signal from the c program.
The signals are sighup,sigkill,sigterm,sigchld and then it has to go to sleep.
If signal is sigchld it has to do to some function.
My question is how to... (3 Replies)
Discussion started by: bhas85
3 Replies
9. Shell Programming and Scripting
Whats a signal 0. An exhaustive search on signals landed me nowhere.
Is it possible to do something like this trap "echo $var" 0.
If so what signal does this trap catch ? (2 Replies)
Discussion started by: kinny
2 Replies
10. UNIX for Advanced & Expert Users
Hi All,
The problem statement is as below:
Problem: A process (exe) is getting executed in background. The output of this process is getting logged in a file. After successfully running for some time the process gets terminated. In the log file following is present:
^M[7m Interrupt ^M[27m... (8 Replies)
Discussion started by: Praty.27
8 Replies
kill(2) System Calls Manual kill(2)
Name
kill - send signal to a process
Syntax
#include <sys/types.h>
#include <signal.h>
kill(pid, sig)
pid_t pid;
int sig;
Description
The system call sends the signal sig to a process specified by the process number pid. The sig can be a signal specified in a call or it
can be 0. If the sig is 0, error checking is performed, but a signal is not sent. This call can be used to check the validity of pid.
The sending and receiving processes must have the same effective user ID, otherwise this call is restricted to the superuser with the
exception of the signal SIGCONT. The signal SIGCONT can always be sent to a child or grandchild of the current process.
If the process number is 0, the signal is sent to all other processes in the sender's process group.
If the process number is negative but not -1, the signal is sent to all processes whose process-group-id is equal to the absolute value of
the process number.
The above two options are variants of
If the process number is -1, and the user is the superuser, the signal is broadcast for all processes except to system processes and the
process sending the signal.
Processes may send signals to themselves.
Environment
System Five
POSIX
When your program is compiled in the System V or POSIX environment, a signal is sent if either the real or effective uid of the sending
process matches the real or saved-set-uid (as described in ) of the receiving process. In addition, any process can use a pid of -1, and
the signal is sent to all processes subject to these permission checks.
In POSIX mode, the pid argument is of type pid_t.
Return Values
Upon successful completion, a value of 0 is returned. Otherwise, a value of -1 is returned, and is set to indicate the error.
Diagnostics
The system call fails under the following conditions:
[EINVAL] The sig is not a valid signal number.
[EPERM] The sending process is not the superuser, and its effective user ID does not match the effective user ID of the receiving
process.
[ESRCH] No process can be found corresponding to that specified by pid.
See Also
execve(2), getpgrp(2), getpid(2), killpg(2), sigvec(2), pause(3)
kill(2)