用c语言实现HUP信号重启进程的方法

代码如下所示:


代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <stdarg.h>
char **bak_argv;
int flag = 0;
void restart(void);
void sighup_handler(int sig);
// argv[0] 尽量使用绝对路径, 因为程序执行过程中可能会使用 chdir() .
int main(int argc, char *argv[])
{
 openlog("sig_hup", LOG_PID, 0);
 syslog(LOG_ERR, "%s", argv[0]);
 closelog();

bak_argv = argv;
 signal(SIGHUP, sighup_handler);

while(1)
 {
  if(flag)
   restart();
  sleep(10);
 }
 return 0;
}
void sighup_handler(int sig)
{
 flag = 1;
}
void restart(void)
{
 switch(fork())
 {
  case -1:
   openlog("sig_hup", LOG_PID, 0);
   syslog(LOG_ERR, "fork failed: %s", strerror(errno));
   closelog();

exit(EXIT_FAILURE);
   break;
  case 0:
   break;
  default:
   exit(EXIT_SUCCESS);
 }
 execv(bak_argv[0], bak_argv);

openlog("sig_hup", LOG_PID, 0);
 syslog(LOG_ERR, "execv(%s, ...) failed: %s\n", bak_argv[0], strerror(errno));
 closelog();

exit(EXIT_FAILURE);
}

时间: 2013-05-26

Linux中使用C语言的fork()函数创建子进程的实例教程

一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.   我们来看一个例子: #include <unistd.h> #include &

C语言中操作进程信号的相关函数使用详解

C语言signal()函数:设置信号处理方式 头文件: #include <signal.h> 定义函数: void (*signal(int signum, void(* handler)(int)))(int); 函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数handler 指定的函数执行. 如果参数handler 不是函数指针, 则必须是下列两个常数之一: 1.SIG_IGN 忽略参数signum 指定的信号. 2

C语言编写Linux守护进程实例

守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任 务.比如,作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致.这需要读者注意,照搬 某些书上的

C语言实现在windows服务中新建进程的方法

本文实例讲述了C语言实现在windows服务中新建进程的方法.分享给大家供大家参考.具体如下: 运行环境:visual stdio 2008 文件名:testService.c #include <windows.h> #include <stdio.h> #include <time.h> #include <tchar.h> HANDLE hMutex; SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDL

Linux下C语言的fork()子进程函数用法及相关问题解析

fork fork()函数是linux下的一个系统调用,它的作用是产生一个子进程,子进程是当前进程的一个副本,它跟父进程有一样的虚存内容,但也有一些不同点. 但是,值得注意的是,父进程调用fork()后,fork()返回的是生成的子进程(如果能顺利生成的话)的ID.子进程执行的起点也是代码中fork的位置,不同的是下面这段C语言代码展示了fork()函数的使用方法: // myfork.c #include <unistd.h> #include <stdio.h> int mai

举例讲解C语言的fork()函数创建子进程的用法

先来看这样一个例子,利用fork调用execlp()函数来在Linux下实现ps或ls命令: #include "sys/types.h" #include "unistd.h" #include "stdio.h" #include "stdlib.h" int main() { pid_t result; result=fork(); //报错处理 if(result==-1) { printf("Fork Er

C语言中设置进程优先顺序的方法

C语言setpriority()函数:设置程序进程执行优先权 头文件: #include <sys/time.h> #include <sys/resource.h> 定义函数: int setpriority(int which, int who, int prio); 函数说明:setpriority()可用来设置进程.进程组和用户的进程执行优先权.参数which 有三种数值, 参数who 则依which 值有不同定义. which who 代表的意义: 1.PRIO_PROC

C语言怎么获得进程的PE文件信息

一.打印Sections信息.下面的程序打印出Windows_Graphics_Programming 1.1中第三个程序"Hello World Version 3:Create a Full-Screen Window"生成的可执行文件的Sections结构字节的信息 #include<stdio.h> #include<windows.h> char *strPath="C:/c1_hwv3/Debug/c1_hwv3.exe"; in

C语言实现查看进程是否存在的方法示例

本文实例讲述了C语言实现查看进程是否存在的方法.分享给大家供大家参考,具体如下: #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> #include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<limits.h> #define BUFSZ 150 void err_quit(char

c语言多进程tcp服务器示例

server.h 复制代码 代码如下: #ifndef SERVER_H#define SERVER_H#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <as

C语言中获取进程识别码的相关函数

C语言getpid()函数:获取进程识别码 头文件: #include <unistd.h> 定义函数: pid_t getpid(void); 函数说明:getpid ()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件, 以避免临时文件相同带来的问题. 返回值:目前进程的进程识别码 范例 #include <unistd.h> main() { printf("pid=%d\n", getpid()); } 执行: pid=1494 /*每

Linux下C语言修改进程名称的方法

本文实例讲述了Linux下C语言修改进程名称的方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <string.h> #include "./util/setproctitle.c" // extern char **environ; // int main(int argc , char *argv[]) // { // int i; // printf("argc:%d\n" , argc);

Linux下如何永久修改主机名的方法步骤

想修改自己的主机名,那你可以根据下面的步骤实现 使用hostname 使用hostname命令只能临时改变我们的主机名,当我们重启之后主机名还会恢复成原来的 # hostname newhostname 输入hostname linux即可将主机名改成linux,使用uname -n命令查看 这时我们的主机名已经改变了,左边为什么依然是Peithon呢,你试试重开一个终端,或者要是用Xshell的话,把会话重开一遍 修改配置文件 想要永久修改自己的主机名,得通过下面的步骤 修改文件/etc/sy

linux下c语言的多线程编程

我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执行的最小单元. 一般一个最简单的程序最少会有一个线程,就是程序本身,也就是主函数(单线程的进程可以简单的认为只有一个线程的进程) 一个线程阻塞并不会影响到另外一个线程. 多线程的进程可以尽可能的利用系统CPU资源. 1创建线程 先上一段在一个进程中创建一个线程的简单的代码,然后慢慢深入. #incl

Linux下C语言的几道经典面试题小结(分享)

本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 2.C语言程序不使用任何条件运算符,打印出十次"Hello"? 答案如下: 或是: 3.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 4.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 5.如果在Linux下使用GCC编

Linux 下C语言连接mysql实例详解

Linux 下C语言连接mysql实例详解 第一步: 安装mysql, 参考:http://www.jb51.net/article/39190.htm 第二步: 安装mysql.h函数库 sudo apt-get install libmysqlclient-dev 执行之后就可以看到/usr/include/MySQL目录了 然后开始我们的链接. 首先看我的数据库 mysql> show databases; +--------------------+ | Database | +----

linux下查看系统进程占用的句柄数方法

---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 131 24204 57 24244 57 24231 ........ 其中第一列是打开的句柄数,第二列是进程ID. 可以根据ID号来查看进程名. # ps aef|grep 24204 nginx 24204 24162 99 16:15 ? 00:24:25

PHP批量修改文件名称的方法分析

本文实例讲述了PHP批量修改文件名称的方法.分享给大家供大家参考,具体如下: 在这里我们利用一个战地自己写的一个例子来具体分析一下利用PHP批量修改文件名称的思路和注意事项. 从这个例子里你将会看到,PHP如何判断一个路径是不是目录,如何用PHP取得路径中的文件名称和文件的扩展名,随机函数rand的基本应用,以及这个程序的核心内容递归函数的基本应用. 程序功能:利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称: 首先判断用户给出的目录是不是一个合法目录: 我们这里只是修

Linux下挂载硬盘分区的几种方法

Linux下挂载硬盘分区的几种方法 1.使用Autofs自动挂载分区 2.修改/etc/fstab 3.编写shell脚本,开机自动运行mount命令 方法一.使用Autofs  1.Autofs的特点:Autofs与Mount/Umount的不同之处在于,它是一种看守程序(deamon).如果它检测到用户正试图访问一个尚未挂接的文件系统,它就会自动检测该文件系 统,如果该文件系统存在,那么Autofs会自动将其挂接.另一方面,如果它检测到某个已挂接的文件系统在一段时间内没有被使用,那么Auto

linux下mysql创建新的用户的方法

1.以root身份登录到MySQL服务器中. $ mysql -u root -p 当验证提示出现的时候,输入MySQL的root帐号的密码. 2.创建一个MySQL用户 使用如下命令创建一个用户名和密码分 为"username"和"userpassword"的用户. mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'userpassword'; 一旦用户被创建后,包括加密的密码.权限和资源限制在

Linux下date命令,格式化输出,时间设置方法

date命令的帮助信息 [root@localhost source]# date --help 用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式显示当前时间,或是设置系统日期. -d,--date=字符串 显示指定字符串所描述的时间,而非当前时间 -f,--file=日期文件 类似--date,从日期文件中按行读入时间描述 -r, --reference=文件 显示文件指定文件的