- 论坛徽章:
- 0
|
大大们好,菜鸟问个小问题。
先上代码:#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
static void sig_usr(int); /* one handler for both signals */
int
main(void)
{
pid_t childpid;
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
perror("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
perror("can't catch SIGUSR2");
if ( ( childpid = fork() ) < 0) perror("fork error");
else if ( childpid > 0 ) {
printf("child pid = %d\n",childpid);
while(1) pause();
}
else{
while(1){
sleep(5);
//while(1) pause(); //waiting signal to wake up ...
printf("sending sig1...\n");
kill(SIGUSR1,childpid);
printf("sending sig2...\n");
kill(SIGUSR2,childpid);
}
}
}
static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
printf("received signal %d\n", signo);
}
|
把上述的代码保存为test1.c
编译选项:gcc test1.c
执行的时候直接在bash下执行 ./a.out
----------------------------------------------
当另一种代码形式:
#include <unistd.h>
#include <signal.h>
static void sig_usr(int); /* one handler for both signals */
int
main(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
perror("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
perror("can't catch SIGUSR2");
for ( ; ; )
pause(); //waiting signal to wake up ...
}
static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
printf("received signal %d\n", signo);
} |
保存为test2.c
编译同上,在当前的bash环境下执行 ./a.out & ,得到pidnum(比如 27100)
然后,输入命令 : kill - USR1 27100 则会在当前的bash环境下输出 received SIGUSR1。
----------------------------------------------------------------------
小菜我的问题就是:
1.为什么采用方式1时,子进程不会输出信息?而我采取在bash环境下发送信号的方式,进程会输出信息???
2.有什么方法可以让test1.c 中的子进程运行时,输出printf语句?
[ 本帖最后由 wpclub 于 2009-4-13 11:33 编辑 ] |
|