父进程与子进程间相互发送信号

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

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

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


#include
#include
#include
#include
#include
#include

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 间的通信等等

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

你可能感兴趣的:(操作系统,操作系统)