正如标题所说我正在尝试创建一个处理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 [],没有人解释原因。我不知道信号处理程序是什么。扩展的表达式和信号正在杀死我这堂课。无论我读了多少,我都无法弄明白。
答案 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