解释#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> void waiting(), stop(); int wait_mark; int main() { int p1, p2; signal(SIGINT, stop); while ((p1 = fork()) == -1); if (p1 > 0) { while ((p2 = fork()) == -1); if (p2 > 0) { wait_mark = 1; waiting(0); kill(p1, 10); kill(p2, 12); wait(); wait(); printf("Parent process is killed!\n"); exit(0); } else { wait_mark = 1; signal(12, stop); waiting(); lockf(1, 1, 0); printf("Child process 2 is killed by parent!\n"); lockf(1, 0, 0); exit(0); } } else { wait_mark = 1; signal(10, stop); waiting(); lockf(1, 1, 0); printf("Child process 1 is killed by parent!\n"); lockf(1, 0, 0); exit(0); } } void waiting() { while (wait_mark != 0); } void stop() { wait_mark = 0; }
时间: 2024-02-14 09:33:44 浏览: 185
这是一个使用信号处理和进程控制的简单的父子进程通信程序。程序中包含了四个头文件:stdio.h、signal.h、unistd.h和stdlib.h。
程序中定义了两个函数waiting()和stop(),分别用于进程等待和停止等待。同时定义了一个全局变量wait_mark,用于标记进程是否等待。
在主函数中,使用了fork()函数创建了两个子进程p1和p2。如果fork()返回值大于0,则说明当前进程为父进程,否则为子进程。父进程使用waiting()函数等待子进程完成,然后向子进程发送信号。子进程使用signal()函数注册信号处理函数,当接收到相应的信号时,执行stop()函数停止等待。
使用lockf()函数实现对输出的互斥,避免多个进程同时向标准输出输出。程序输出父进程和子进程被杀死的信息。最后使用exit()函数退出进程。
需要注意的是,这段代码可能存在一些问题,例如信号处理函数的稳定性和进程控制的正确性等。此外,程序的输出结果可能会因为进程调度顺序的不同而有所差异。
相关问题
#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 <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void sigintTest(int sign_no) { printf("\nI have get SIGINT\n"); } void sigQuitTest(int sign_no) { printf("\nI have get SIGQUIT\n"); exit(0); } int main() { printf("Waiting for signal SIGINT \n "); signal(SIGINT, sigintTest); signal(SIGQUIT,sigQuitTest); pause(); while(1) { printf("I am running.\n"); sleep(1); } printf("bye.\n"); exit(0); }
这是一个使用信号处理程序的 C 语言程序。程序中定义了两个信号处理函数:`sigintTest()` 和 `sigQuitTest()`,分别处理 `SIGINT` 和 `SIGQUIT` 信号。在 `main()` 函数中,先输出一条等待信号的提示信息,然后使用 `signal()` 函数分别将 `SIGINT` 和 `SIGQUIT` 信号的处理函数注册到信号处理表中。接着调用 `pause()` 函数使程序挂起等待信号的到来,一旦收到信号,就会调用相应的信号处理函数。在程序中,如果收到 `SIGINT` 信号,会输出一条提示信息;如果收到 `SIGQUIT` 信号,会输出另一条提示信息,然后使用 `exit()` 函数退出程序。如果没有收到信号,程序会进入一个死循环,不断输出一条提示信息,直到收到信号后退出程序。
阅读全文