精华内容
下载资源
问答
  • 一、简单版本 代码块 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include ...由此可见子进程在退出前会进程发送SIGCHLD(17号信号信号

    一、简单版本

    代码块

     1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<unistd.h>
      4 #include<sys/types.h>
      5 #include<sys/wait.h>
      6 #include<signal.h>
      7 void catchSig(int sig)
      8 {
      9   printf("get a sig: %d,pid: %d\n",sig,getpid());
     10 }
     11 int main()
     12 {
     13     signal(SIGCHLD,catchSig);//catch SIGCHLD(17)
     14     pid_t id=fork();//create child process
     15     if(id == 0)
     16     {
     17         //child
     18         printf("i am child,quit!my pid is %d\n",getpid());
     19         exit(1);
     20     }
     21     else
     22     {
     23         //father
     24         waitpid(id,NULL,0);//wait child                                     
     25     }
     26 return 0;
    

    Makefile文件

      1 pro1 : pro1.c
      2     gcc -o $@  $^ -lpthread -g                                              
      3 .PHONY:clean
      4 clean:
      5     rm -f pro1
    

    运行结果

    这里写图片描述

    总结

    由此可见子进程在退出前会给父进程发送SIGCHLD(17号信号)信号。

    展开全文
  • pthread_kill向子进程发送信号函数

    千次阅读 2015-09-12 15:59:11
    pthread_kill: ...大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。 int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程
    pthread_kill:
    


    别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,
    大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。


    int pthread_kill(pthread_t thread, int sig);


    向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,
    也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。


    pthread_kill(threadid, SIGKILL)也一样,杀死整个进程。
    如果要获得正确的行为,就需要在线程内实现signal(SIGKILL,sig_handler)了。


    所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,
    否则,就会影响整个进程。




    OK,如果int sig是0呢,这是一个保留信号,一个作用是用来判断线程是不是还活着。


    我们来看一下pthread_kill的返回值:
    成功:0
    线程不存在:ESRCH
    信号不合法:EINVAL


    所以,pthread_kill(threadid,0)就很有用啦。


    int kill_rc = pthread_kill(thread_id,0);


    if(kill_rc == ESRCH)
    printf("the specified thread did not exists or already quit\n");
    else if(kill_rc == EINVAL)
    printf("signal is invalid\n");
    else
    printf("the specified thread is alive\n");


    上述的代码就可以判断线程是不是还活着了。
    展开全文
  • 杀死 pid 发送进程的信号,kill 其他进程发送信号,指定进程号 printf( " child killed\n " ); printf( " father \n " ); wait (NULL); //等待回收子进程的资源 raise(SIGKILL); // 杀死自己的信号,函数...

     

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <signal.h>
    #include <unistd.h>
    void handler(int arg) { printf("receive SIGCHLD\n"); } int main(int argc, const char *argv[]) { signal(SIGCHLD,handler); //注册信号回调函数,当信号发生会调用handler pid_t pid; pid = fork(); if(pid < 0) { perror("fork fail "); exit(1); } else if(pid == 0) //子进程 { while(1) { printf("child \n"); sleep(1); } } else //父进程 { sleep(1); //睡 1 秒 kill(pid,SIGKILL);//杀死 pid 发送进程的信号,kill 给其他进程发送信号,指定进程号 printf("child killed\n"); printf("father \n"); wait(NULL); //等待回收子进程的资源 raise(SIGKILL); //杀死自己的信号,函数raise 给自己发送信号 } return 0; }

     测试:

     

    转载于:https://www.cnblogs.com/electronic/p/10945532.html

    展开全文
  • 父进程与子进程间相互发送信号

    千次阅读 2016-10-27 22:51:10
    父进程与子进程间通信(软中断)

      最近想要实现父子进程间的通信,两个进程间能“软中断”,也就是使用signal函数将进程与handler函数绑定。

      其中的难点在于如何在父进程中获取子进程的pid,由于实际的程序中,父进程有唯一的子进程,所以我采用的方法是

    直接将父进程的 pid + 1 也就获取了子进程的pid,有一丝奇技淫巧的感觉,but , it works.


    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<signal.h>
    #include<unistd.h>
    
    void father_handler(int sig){
    	printf("%d get kill\n" , getpid());
    	printf("%d kill %d\n" , getpid() , getpid() + 1);
    	
    	kill(getpid() + 1 , SIGUSR2);//向子进程发送信号
    				     //由于父进程有唯一的子进程所以pid直接加一	
    				      		
    	return;
    }
    
    void child_handler(int sig){
    	printf("%d(whose father is %d) get kill\n" , getpid() , getppid());
    	printf("%d kill %d \n" , getpid() , getppid());
    
    	kill(getppid() , SIGUSR1);//向父进程发送信号
    
    	return;
    }
    
    void father_connect(){ //父进程与handler函数绑定
    	if (signal(SIGUSR1 , father_handler) != SIG_ERR){
    		printf("father(%d) success \n" , getpid());
    	}	
    }
    
    void child_connect(){//子进程与handler函数绑定
    	if (signal(SIGUSR2 , child_handler) != SIG_ERR){
    		printf("child(%d) success \n" , getpid());
    		printf("%d kill %d \n" , getpid() , getppid());
    
    		kill(getppid() , SIGUSR1);//触发父进程的handler
    
    	}
    }
    
    int main(){
    	pid_t pid = fork();
    	if (pid > 0){
    		father_connect();
    	}else{
    		child_connect();
    	}
    	while(1);
    }

      由于两个进程间能够互相软中断,我们可以实现很多功能,比如模拟client 与 server 间的通信等等

      之后会用使用这个奇技淫巧做些东西出来

    展开全文
  • 其实在子进程退出时,会进程发送一个SIGCHLD,17号信号。 那么下面用代码来验证一下: 首先要捕捉SIGCHLD信号,输出 i am %d signal ; 再创建子进程,在子进程中输出 i am child,然后退出; 在父进程中每隔...
  • 使用kill向进程发送信号

    千次阅读 2013-01-17 17:02:23
    kill()函数可以向任何进程发送信号 如果进程pid确定,信号sig将被发送进程pid pid = 0; sig将会被发送至当前进程组的每一个进程 pid = -1; sig将被发送至除进程1之外的所有允许发送的进程 pid 一般
  • 利用SIGCHLD信号回收子进程

    千次阅读 2021-01-28 22:42:05
    由于子进程结束时会发送SIGCHLD信号给父进程,不过此信号的默认动作为忽略,我们可以通过系统函数sigaction()设置信号捕捉,在信号捕捉函数中去回收子进程。 信号捕捉函数中回收子进程的方法: waitpid函数 下面展示...
  • linux kill信号列表 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2...
  • 用于向任何进程组或进程发送信号 #include signal.h> int kill(pid_t pid, int sig); 2. 参数:  pid:可能选择有以下四种  1. pid大于零时,pid是信号欲送往的进程的标识。  2. pid等于零时,信号将...
  • 子进程对父进程信号的继承情况fork创建子进程,但是没有exec加载新程序时当有调用exec加载新程序时情况一情况二总结 子进程对父进程信号的继承情况 父进程fork出子进程时,子进程会继承父进程很多的属性,其中就包括...
  • (1)前台进程,用户可以通过输入特殊终端字符来发送信号。比如Ctrl+C通常给进程发送一个中断信号——2号信号(SIGINT),只能终止前台进程。  (2)系统异常。比如浮点异常——8号信号(SIGFPE)。  (3)系统...
  • 1. 基本概念  1)中断  中止(注意不是终止)当前正在执行的程序,转而执行其它任务。  硬件中断:来自硬件... 信号提供了一种以异步方式执行任务的机制。  3)常见信号  SIGHUP(1):连接断开信号  如果终端
  • 一、问题描述 在用Python爬取网络视频时,利用了ffmpeg下载并合并m3u8文件,在CMD上运行结果如下: C:\Users\fz.000&gt;ffmpeg -i "...
  • 子进程信号处理及wait waitpid区别

    千次阅读 2013-09-23 10:09:03
    当一个进程正常或异常终止时,内核就向父进程发送SIGCHLD信号,因为子进程终止是个异步事件,可以在父进程运行的任何时候发生,所以这种信号也是内核向父进程发的异步通知,父进程可以选择忽略该信号,或者提供一个...
  • QT QProcess 进行在windows下进行通信发送给子进程接受不到消息解决Linux下,网上的通信很正常在windows下 Linux下,网上的通信很正常 这是QProcess的发送方式 process = new QProcess(this); // 开始,处于准备...
  • 当一个父进程创建一个子进程时,最好要调用wait或者waitpid函数等待子进程,不然会产生僵尸进程造成是内存泄漏的问题。一般父进程在等待子进程时有两种方式等待,一种是阻塞式等待,这时父进程不能处理自己的工作;...
  • Linux kill --终止进程/发送信号

    千次阅读 2016-04-08 10:33:14
    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,...kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下
  • 先看一个父进程向子进程发kill信号例子: #include #include #include #include #include int main(int argc, const char *argv[]) { pid_t pid; int status; pid = fork(); if (0 == pid) { pri
  • C++使用kill发送信号终止目标进程

    千次阅读 2019-03-31 19:25:57
    一点睛 #include<...kill()可以用来送参数sig指定的信号给参数pid指定的进程。 参数pid有几种情况: pid>0 将信号传给进程识别码为pid的进程。 pid=0 将信号传给和目前进程相同进程组...
  • 子进程通过管道将字符串“hello!\n”传父进程并显示*/
  • 37-使用 kill 函数发送信号

    千次阅读 2016-12-24 13:31:38
    一直以来,我们程序发送信号都是通过快捷键(Ctrl+C, Ctrl+Z, Ctrl+\) 或者使用系统命令kill来向进程发送信号(还有一种是系统你发送的信号,比如 SIGCHLD、SIGSEGV 等等)。除此之外,也可以通过函数 int kill...
  • 1.... 先是子进程给自己发送了SIGTSTP,这样子进程就停止了。 当父进程收到子进程STP后,发送了SIGCONT信号,让子进程继续执行。 要接收这两个时间,waitpid需要使用WUNTRACED,WCO
  • 父控制子进程通讯

    2017-03-26 00:59:23
    通过父进程控制子进程stdin发送命令给子进程执行.
  • 父进程收到该信号后,会释放分配子进程的系统资源;并且父进程需要调用wait()或waitpid()等待子进程结束。如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的...
  • 进程间通信--信号发送
  • 目录[-] 用途说明 常用参数 使用示例 示例一 kill命令是什么类型的命令 示例二 列出所有信号名称 示例三 得到指定信号的数值 ...kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的
  • 当父进程先结束时,会发送信号给子进程子进程强制退出。(例如:父进程 sleep(6)) 当子进程先结束时,会向父进程发出信号,结束进程。(例如:父进程 sleep(15)) ...
  • 在所有信号中:SIGKILL -9/SIGKILL-19 不能被阻塞,不能被修改处理方式...SIGCHLD(非可靠信号):子进程退出之后进程发送信号 默认处理方式:什么都不做(即忽略) 自定义SIGCHLD信号的处理方式,在信号回...
  • Android -- Init进程信号的处理流程

    千次阅读 2017-02-17 08:52:51
    父进程收到该信号后,会释放分配子进程的系统资源;并且父进程需要调用wait()或waitpid()等待子进程结束。如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGC

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,635
精华内容 36,654
关键字:

给子进程发送信号