#include<stdio.h> #include<signal.h> #include <unistd.h> int func() { printf("It is signal 17 processing function!\n"); } main() { int i, j; signal(17, func); if (i = fork()) { printf("Parent:Signal 17 will be send to Child!\n"); kill(i, 17); wait(0); printf("Parent:finished!\n"); } else { sleep(10); printf("Child:A signal from my Parent is received!\n"); exit(); } }的运行结果
时间: 2024-03-11 11:44:16 浏览: 42
该程序是一个使用kill()函数向子进程发送信号的简单示例程序,子进程收到信号后输出信息,父进程等待子进程结束后输出"Parent:finished!"信息。
运行结果可能如下:
Parent:Signal 17 will be send to Child!
It is signal 17 processing function!
Child:A signal from my Parent is received!
Parent:finished!
解释如下:
1.首先父进程创建子进程并且使用signal()函数为信号17注册了一个处理函数func()。
2.父进程使用kill()函数向子进程发送信号17。
3.子进程通过signal()函数注册的处理函数func()处理了收到的信号,并输出了相关信息。
4.父进程使用wait()函数等待子进程结束。
5.子进程结束后,父进程输出"Parent:finished!"信息。
需要注意的是,程序中使用了sleep()函数来让子进程暂停10秒,以便父进程在发送信号之前等待子进程准备好接收信号。
相关问题
#include<pthread.h> #include<stdlib.h> #include <stdio.h> #include <sys/types.h> #include<signal.h> #include <unistd.h> void func () ; int main (void *arg) { int i,j; signal (17,func); int iPID=fork () ; if(iPID>0){ printf("PID:%d,Parent: Signal 17 will_be send to Child! " , getpid()) ; kill(iPID,17) ; printf ( "PID:%d, Parent: finished! " , getpid() ); } else { printf ( "PID:%d " , getpid()); sleep (1); printf ("PID:%d, Child: finished ! " , getpid()); exit (0); } return 0; } void func ( ) { printf("PID:%d,It is signal 17 processing function! " , getpid() ) ; }
这是一个用 C 语言写的进程间通信程序,使用了 fork 函数创建子进程,并在父进程中向子进程发送信号。
程序中先定义了一个 signal 函数的回调函数 func,用于接收信号 17,并在接收到信号后打印一条信息。
在 main 函数中,首先使用 signal 函数注册信号 17 的处理函数为 func。然后使用 fork 函数创建一个子进程。如果 iPID>0,则表示当前进程是父进程,它会打印出自己的进程 ID(PID),然后向子进程发送信号 17。接着父进程会打印出自己的进程 ID 并结束。
如果 iPID=0,则表示当前进程是子进程,它会打印出自己的进程 ID,然后等待 1 秒钟,最后打印出自己的进程 ID 并结束。
需要注意的是,进程间通信的方式有很多种,这里使用信号是其中的一种。在程序中使用了 signal 函数注册信号处理函数,同时使用了 kill 函数向子进程发送信号。在实际场景中,还可以使用共享内存、消息队列、信号量等方式进行进程间通信。
详细分析以下代码#include <stdio.h> #include <signal.h> #include <unistd.h> #include<stdlib.h> #include<sys/wait.h> // 声明函数 func int func(); // 处理信号 17 的函数 int func() { printf("It is signal 17 processing function!\n"); // 添加分号 return 0; } int main() { int i,j; // 注册信号处理函数 // signal(17, func); signal(17, (__sighandler_t)func); if(i=fork()) { printf("Parent: Signal 17 will be sent to Child!\n"); // 向子进程发送信号 17 kill(i,17); wait(0); printf("Parent: finished!\n"); } else { // 子进程休眠 10 秒 sleep(10); printf("Child: A signal from my Parent is received!\n"); exit(0); } }
这段代码主要是演示了在父子进程之间使用信号进行通信的过程。下面是代码详细分析:
1. 引入头文件
```
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
```
这些头文件包含了信号处理函数和进程通信相关的函数。
2. 声明函数 func
```
int func();
```
这里声明了一个名为 func 的函数,返回类型为 int。
3. 实现函数 func
```
int func() {
printf("It is signal 17 processing function!\n");
// 添加分号
return 0;
}
```
这个函数实现了对信号 17 的处理,输出一段信息并返回一个值。
4. 主函数
```
int main() {
int i,j;
// 注册信号处理函数
signal(17, (__sighandler_t)func);
if(i=fork()) {
printf("Parent: Signal 17 will be sent to Child!\n");
// 向子进程发送信号 17
kill(i,17);
wait(0);
printf("Parent: finished!\n");
}
else {
// 子进程休眠 10 秒
sleep(10);
printf("Child: A signal from my Parent is received!\n");
exit(0);
}
}
```
这个主函数分为父进程和子进程两部分。首先在父进程中注册了信号处理函数,将信号 17 的处理函数设为 func。然后通过 fork() 函数创建了一个子进程,并在父进程中向子进程发送信号 17。子进程在收到信号后,输出一段信息并结束。
这段代码主要是演示了父子进程之间使用信号进行通信的过程。首先在父进程中注册了信号处理函数,然后向子进程发送了信号。子进程在收到信号后,执行了相应的操作。这种通信方式可以在进程之间传递信息,控制进程的行为。
阅读全文