APUE前几页的例子:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 4096
int main(int argc , char** argv) {
char buf[MAXLINE];
pid_t pid;
int status;
printf("%%");
while ( fgets(buf, MAXLINE, stdin) != NULL) {
if ( buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if ((pid = fork()) < 0){
fprintf(stderr, "fork() error\n");
exit(1);
} else if (pid == 0) {
execlp(buf, buf, (char*)0);
fprintf(stderr, "execlp() error\n");
exit(127);
}
if ((pid == waitpid(pid, &status, 0)) <0)
fprintf(stderr, "waitpid() error\n");
printf("%%");
}
exit(0);
}
如果以上的程序打开python解释器,使用Ctrl+C会中断程序
如果改成这样:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
static void sig_int(int signo) { //只是打印信息
printf("Interrupt%%\n");
}
#define MAXLINE 4096
int main(int argc , char** argv) {
char buf[MAXLINE];
pid_t pid;
int status;
if (signal(SIGINT, sig_int) == SIG_ERR) {//signal 第二个参数应该是函数指针
printf("signal error()\n");
}
printf("%%");
while ( fgets(buf, MAXLINE, stdin) != NULL) {
if ( buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if ((pid = fork()) < 0){
fprintf(stderr, "fork() error\n");
exit(1);
} else if (pid == 0) {
execlp(buf, buf, (char*)0);
fprintf(stderr, "execlp() error\n");
exit(127);
}
if ((pid == waitpid(pid, &status, 0)) <0)
fprintf(stderr, "waitpid() error\n");
printf("%%");
}
exit(0);
}
再使用Ctrl+C就不会退出python解释器了,看来signal()很强悍,可以对程序发送消息,具体内容以后再深入学习吧.呵呵...