试图创建一个处理SIGUSR1的程序,Child应该执行另一个可执行文件

时间:2017-10-22 18:10:53

标签: c makefile fork exec

正如标题所说我正在尝试创建一个处理SIGUSR1的程序,程序的Child需要执行另一个可执行文件。这可以是硬编码的,也可以来自命令行,我现在选择硬编码。

这是用vim编写的C语言(爱上了Linux类)。

我的父母似乎至少在最后运行了printf()。

我有两个.c文件,一个名为parent.c,另一个名为child.c

我父程序的代码如下:

#include <stdlib.h>
#include <signal.h>
#include <stdio.h>


int signalHandle(int signo)
{
        if(signo == SIGUSR1)
        {
                printf("Signal recived from child.\n");
        }
        else
                printf("Unexpected signal received");
        return;

}


int main()
{
        pid_t child = fork();
        if (child == 0)
        {
                execvp("child", signalHandle(child));
        }

        sleep(10);
        printf("Now finishing the parent process pid of %d\n", getpid());


}

儿童计划如下:

#include <stdio.h>                                                                                         
#include <stdlib.h>                                                                                        


int main()                                                                                                 
{                                                                                                          

        printf("This is the child, with pid %d and parent pid %d\nHello World", getpid(), getppid());      
        sleep(5);                                                                                          
        printf("Now exiting the child program...\n");                                                      
        return 0;                                                                                          

}                                                                                                          

我的makefile看起来像:

all: parent child                        

parent: parent.c                         
        gcc -o parent parent.c           

child: child.c                           
        gcc -o child child.c             

当我运行Makefile时,我收到一些警告:

gcc -o parent parent.c
parent.c: In function ‘signalHandle’:
parent.c:14:2: warning: ‘return’ with no value, in function returning non-void
  return;
  ^
parent.c: In function ‘main’:
parent.c:21:16: warning: implicit declaration of function ‘fork’ [-Wimplicit-function-declaration]
  pid_t child = fork();
                ^
parent.c:24:3: warning: implicit declaration of function ‘execvp’ [-Wimplicit-function-declaration]
   execvp("child", signalHandle(child));
   ^
parent.c:27:2: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]
  sleep(10);
  ^
parent.c:28:57: warning: implicit declaration of function ‘getpid’ [-Wimplicit-function-declaration]
  printf("Now finishing the parent process pid of %d\n", getpid());
                                                         ^
gcc -o child child.c
child.c: In function ‘main’:
child.c:8:74: warning: implicit declaration of function ‘getpid’ [-Wimplicit-function-declaration]
  printf("This is the child, with pid %d and parent pid %d\nHello World", getpid(), getppid());
                                                                          ^
child.c:8:84: warning: implicit declaration of function ‘getppid’ [-Wimplicit-function-declaration]
  printf("This is the child, with pid %d and parent pid %d\nHello World", getpid(), getppid());
                                                                                    ^
child.c:9:2: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]
  sleep(5);
  ^

它确实运行但我的程序的当前输出是:

zerkereod@zerkereod-VirtualBox:~/Class/admin/asullivan/lab7$ ./parent
Now finishing the parent process pid of 9763
zerkereod@zerkereod-VirtualBox:~/Class/admin/asullivan/lab7$ Unexpected signal receivedNow finishing the parent process pid of 9764

我已查找了大量代码,但我看到使用exec的每个人都使用argv或argv [],没有人解释原因。我不知道信号处理程序是什么。扩展的表达式和信号正在杀死我这堂课。无论我读了多少,我都无法弄明白。

1 个答案:

答案 0 :(得分:1)

parent.c:14:2: warning:这是因为int signalHandle(int signo);  应该返回一个 int ,当你输入return;时,你试图什么也不返回。您应该更改void signalHandle(int signo);的原型,因为此函数不会返回值。

fork()是来自unistd.h的函数。由于您不包含此lib,因此编译器无法识别它。同意'execvp','sleep','getpid'和'getppid'。你应该添加

#include <sys/types.h>
#include <unistd.h>

代码,因此您可以使用这些功能。

要声明信号处理程序,您必须包含signal.h lib。要将函数声明为信号处理程序,必须使用signal函数。处理程序应该只接收一个参数(信号)并返回void。

父进程捕获SIGUSR1信号的正确方法是:

void signalHandle(int signo)
{
    printf("Signal SIGUSR1 received from child.\n");
}

在parent.c main中你必须打电话:

signal(SIGUSR1, signalHandle);

要让子进程发送信号,必须使用父进程'kill'功能:

kill(getppid(), SIGUSR1);

你将错误的参数传递给execvp。第一个参数应该是.exe文件的名称。第二个参数是一个字符串数组,其中第一个元素也应该是文件的名称,最后一个元素必须是NULL:

char *argv[2];
argv[0] = "child";
argv[1] = NULL;
execvp(argv[0], argv);

您应该在以下链接中了解更多信息: http://man7.org/linux/man-pages/man2/signal.2.html http://man7.org/linux/man-pages/man2/kill.2.html