两个进程之间的Kill()函数

时间:2016-12-28 21:25:00

标签: c

我可以使用kill()函数向另一个进程发送信号吗?它应该是可能的,但kill()失败了,我无法理解为什么。 我有两个程序(process_1和process_2)。第一个应该设置一个信号处理程序来增加一个变量,而不是创建一个使用execve并加载process_2的子项。另一个程序应该使用kill()发送信号。我使用共享内存通过结构共享process_1的pid(因为我有其他变量要共享)。第一个程序的代码如下:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/wait.h>

#define KEY_SM 1234
static int value_to_change=0;


typedef struct keys{
    pid_t pid_process;
}keynote;


static void test_handler(int signo){
    if(signo=SIGUSR1){
        printf("received SIGUSR1\n");
        value_to_change++;
    }
}


int main(){
    if((signal(SIGUSR1, test_handler))==SIG_ERR) perror("Errore allocazione SIGUSR1");
    int flags = S_IRUSR|S_IWUSR|IPC_CREAT;
    size_t shm_size = sizeof(keynote);
    int shm_id = shmget(KEY_MC, shm_size, flags);
    keynote *chv = shmat(shm_id, NULL, 0);
    chv->pid_process=getpid();
    printf("%d\n",chv->pid_process);


    int process_2;
    process_2=fork();
    if(process_2==0){
        char* argv[]={"process_1", "process_2", NULL};
        if((execve("process_2", argv, NULL))<0) perror("execve error");
    exit(0);
    }else if(process_2<0)perror("fork error");

    return 0;
}

第二个程序代码是:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/wait.h>

 #define KEY_SM 1234

    typedef struct keys{
        pid_t pid_process;
    }keynote;


static void signal_to_send(pid_t process){
    int ret=kill(process, SIGUSR1);
    printf("%d", ret);
    }
}


int main(int argc, char **argv){
    int pid_of_process_1;
    int flags = S_IRUSR|S_IWUSR|IPC_CREAT;
    size_t shm_size = sizeof(keynote);

    int shm_id = shmget(KEY_MC, shm_size, flags);  
    keynote *chv = shmat(shm_id, NULL, 0);
    signal_to_send(chv->pid_process);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

process_1不等待process_2。它只是立即退出。此时process_2可能还没有开始。因此,当process_2发送信号时,process_1很可能不再存在。                     –钾盐