当前位置:首页 » 操作系统 » linuxkill函数

linuxkill函数

发布时间: 2023-05-17 21:59:52

linux 环境下的C语言, 关于 kill 发送信号和 signal() 函数, 具体问题在以下代码的注释处

pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断。

当50信号触动了,pause将退出睡眠状态,执行printf和return

⑵ linux下nohup 命令怎么kill

Unix中 nohup 命令功能就是不挂断地运行命令,同时 nohup 把程序的所有输出到放到当前目录 nohup.out 文件中,如果文件不可写,则放到 <用户主目录>/nohup.out 文件中。那么有了这个命令以后我们php就写成shell 脚本使用循环来让我们脚本一直运行下去,不管我们终端窗口是否关闭都能够让我们php 脚本一直运行下去。 马上动手写个 PHP 小程序,功能为每30秒记录时间,写入到文件 复制代码 代码如下: # vi for_ever.php #! /usr/local/php/bin/php define('ROOT', dirname(__FILE__).'/'); set_time_limit(0); while (true) { file_put_contents(ROOT.'for_ever.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND); echo date('Y-m-d H:i:s'), ' OK!'; sleep(30); } ?> 保存退出,然后赋予 for_ever.php 文件可执行权限: # chmod +x for_ever.php 让它在再后台执行: # nohup /home/andy/for_ever.php.php & 记得最后加上 & 符号,这样才能够跑到后台去运行 执行上述命令后出现如下提示: [1] 5157 nohup: appending output to 'nohup.out' 所有命令执行输出信息都会放到 nohup.out 文件中 这时你可以打开 for_ever.php 同目录下的 for_ever.txt 和 nohup.out 看看效果! 好了,它会永远运行下去了,怎么结束它呢? # ps PID TTY TIME CMD 4247 pts/1 00:00:00 bash 5157 pts/1 00:00:00 for_ever.php 5265 pts/1 00:00:00 ps # kill -9 5157 找到进程号 5157 杀之,你将看到 [1]+ Killed nohup /home/andy/for_ever.php OK! ==================== 在很多项目中,或许有很多类似的后端脚本需要通过crontab定时执行。比如每10秒检查一下用户状态。脚本如下: @file: /php_scripts/scan_userstatus.php 复制代码 代码如下: #!/usr/bin/env php -q $status = has_goaway(); if ($status) { //done } ?> 通过crontab定时执行脚本scan_userstatus.php #echo “*:*/10 * * * * /php_scripts/scan_userstatus.php” 这样,每隔10秒钟,就会执行该脚本。 我们发现,在短时间内,该脚本的内存资源还没有释放完,又启用了新的脚本。也就是说:新脚本启动了,旧脚本占用的资源还没有如愿释放。如此,日积月累,浪费了很多内存资源。我们对这个脚本进行了一下改进,改进后如下: @file: /php_scripts/scan_userstatus.php 复制代码 代码如下: #/usr/bin/env php -q while (1) { $status = has_goaway(); if ($status) { //done } usleep(10000000); } ?> 这样,不需要crontab了。可以通过以下命令执行脚本,达到相同的功能效果 #chmod +x /php_scripts/scan_userstatus.php #nohup /php_scripts/scan_userstatus.php & 在这里,我们通过&将脚本放到后台运行,为了防止随着终端会话窗口关闭进程被杀,我们使用了nohup命令。那么有没有办法,不使nohup命令,也能够运行呢,就像Unin/Linux Daemon一样。接下来,就是我们要讲的守护进程函数。 什么是守护进程?一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显着的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork() 详细如下: @file: /php_scripts/scan_userstatus.php 复制代码 代码如下: #/usr/bin/env php -q daemonize(); while (1) { $status = has_goaway(); if ($status) { //done } usleep(10000000); } function daemonize() { $pid = pcntl_fork(); if ($pid === -1 ) { return FALSE; } else if ($pid) { usleep(500); exit(); //exit parent } chdir("/"); umask(0); $sid = posix_setsid(); if (!$sid) { return FALSE; } $pid = pcntl_fork(); if ($pid === -1) { return FALSE; } else if ($pid) { usleep(500); exit(0); } if (defined('STDIN')) { fclose(STDIN); } if (defined('STDOUT')){ fclose(STDOUT); } if (defined('STDERR')) { fclose(STDERR); } } ?> 实现了守护进程函数以后,则可以建立一个常驻进程,所以只需要执行一次: #/php_scripts/scan_userstatus.php 这里较为关键的二个php函数是pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,而返进程ID号,则表示在父进程中。在这里,退出父进程。setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端). 其它事项说明: 1) chdir() 将守护进程放到总是存在的目录中,另外一个好处是,你的常驻进程不会限制你umount一个文件系统。 2)umask() 设置文件模式,创建掩码到最大的允许限度。如果一个守护进程需要创建具有可读,可写权限的文件,一个被继承的具有更严格权限的掩码会有反作用。 3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。注意,如果有输出(echo),则守护进程会失败。所以通常将STDIN, STDOUT, STDERR重定向某个指定文件.

⑶ linux中用kill函数给init进程发送一个终止信号有什么后果

别容易出现问题。
pid=fork();
if(pid==0)
{
子进程处理....
}
else if(pid >0)
{
父进程处理....
}
else
fork出错处理

把你的程序改成上述形式之后,
kill完了,检查下kill的返回值,没有错误。我换了一个信号,SIGUSR1,并且给它注册了一个简单的信号处理函数,问题就搞定了。
SIGCONT的默认的信号处理函数不知道是什么,但是发送SIGCONT并不能让子进程返回,除非手动的注册一个信号处理函数。

你试试吧。。我简单修改的程序,好像在子进程里面exec没反应,但exec没错:
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<signal.h>

void tasksighandler(int signalnum);

void init()
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<10;a++)
{
printf("task is diong ...\n");
sleep(1);
}
execl("/bin/ls","ls",NULL);

perror("execl");
}

void tasksighandler(int signalnum)
{
printf("OK,catch the signal\n");
}

int main()
{
int i;
pid_t pid=0;
pid=fork();
if (pid == 0) /* 子进程执行此命令 */
{
signal(SIGUSR1,tasksighandler);
printf("task is ready ...\n");
//printf("task's pid= %d\n",getpid());
pause(); //子程序挂起
printf("task's restarted...\n");
int a=0;
for(a=0;a<5;a++)
{
printf("task is diong ...\n");
sleep(1);
}

}

else if(pid > 0)
{
printf("pid is %d\n",pid);

sleep(5);
int retCode=kill(pid,SIGUSR1); //父进程给子进程发送信号,要求子进程继续运行
if(retCode <0)
{
perror("send signal error");
}

sleep(8);
return 0;
}

else
{
perror("fork error\n");
exit(-1);
}
}

下面是关于SIGCONT的一些说明,好像你这里使用的场合并不适合:
在 POSIX-服从的平台, SIGCONT 是 信号 送到再开始a 计算机程序 由早先停留 SIGSTOP 信号。 符号常数 为SIGCONT在被定义 标头文件 signal.h. 符号信号名字,因为信号数字可能横跨平台,变化使用。
用法

当 SIGSTOP 在它的现状被送到过程,通常行为是停留那个过程。 如果送它SIGCONT信号,过程只将恢复施行。 SIGSTOP和SIGCONT使用为 作业控制 在 UNIX外壳程序在其他目的中。
另外,虚机团上产品团购,超级便宜

⑷ Linux kill函数返回了1是什么情况

返回1是没有权限
man 2 kill
可以查到kill函数的错误返回:EINVAL、EPERM和ESRCH
再看error.h里:
#define EPERM 1 /* Operation not permitted */

#define ESRCH 3 /* No such process */

#define EINVAL 22 /* Invalid argument */

⑸ linux 中 kill() 与 signal() 函数

虽然子进程将父进程的函数重新拷贝了一份,子进程和父进程共享同一段内存空间,但不能被共享。可以通过共享内存解决这个问题。使用这个函数void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)把进程地址空间映射为共享内存。addr为被映射的进程地址空间内存地址,取NULL表示由系统决定;len为被映射地址空间的长度;prot为内存映射区保护参数,通常取为PROT_READ|PROT_WRITE;flags为标志,通常取为MAP_SHARED|MAP_ANON;fd取为-1,offset取为0。成功返回被映射区的起始地址,失败返回错误码。需要的头文件为:sys/mman.h。
使用方法:int * share; //假设要把share所指向的一个整型变量映射为共享内存空间。
share = (int *)mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0 )这样就能实现你说的 了.

⑹ unix,linux环境编程中关于signal函数和kill函数问题

signal函数调用后会进入系统的信号队列,具体什么时候执行是不可控的。

⑺ Linux的kill函数和SIGUSR1信号。

对于这个信号而言,没有信号响应函数的话,进程应该会异常终止,对于系统已有的信号一般都是有默认处理的,具体的我有点记不得了,搜下其实就知道了.我在网上找了下各信号默认处理方式,你看看吧,对你有没有用
信号名称 信号说明 默认处理
SIGABRT 由程序调用 abort时产生该信号。 程序异常结束。 进程终止并且产生core文件
SIGALRM timer到期, 有alarm或者setitimer 进程终止
SIGBUS 总线错误,地址没对齐等。取决于具体硬件。 结束终止并产生core文件
SIGCHLD 进程停止或者终止时,父进程会收到该信号。 忽略该信号
SIGCONT 让停止的进程继续执行 继续执行或者忽略
SIGFPE 算术运算异常,除0等。 进程终止并且产生core文件。
SIGHUP 终端关闭时产生这个信号 进程终止
SIGILL 代码中有非法指令 进程终止并产生core文件
SIGINT 终端输入了中断字符ctrl+c 进程终止
SIGIO 异步I/O,跟SIGPOLL一样。 进程终止
SIGIOT 执行I/O时产生硬件错误 进程终止并且产生core文件
SIGKILL 这个信号用户不能去捕捉它。 进程终止
SIGPIPE 往管道写时,读者已经不在了,或者往一个已断开数据流socket写数据。 进程终止
SIGPOLL 异步I/O,跟SIGIO一样。 进程终止
SIGPROF 有setitimer设置的timer到期引发 。 进程终止
SIGPWR Ups电源切换时 进程终止
SIGQUIT Ctrl+\,不同于SIGINT,这个是会产生core mp文件的。 进程终止并且产生core文件
SIGSEGV 内存非法访问,默认打印出segment fault 进程终止并且产生core文件
SIGSTOP 某个进程停止执行,该信号不能被用户捕捉。 进程暂停执行
SIGSYS 调用操作系统不认识的系统调用。 进程终止并且产生core文件
SIGTERM 有kill函数调用产生。 进程终止
SIGTRAP 有调试器使用,gdb 进程终止并且产生core文件
SIGTSTP Ctrl+z,挂起进程。 进程暂停
SIGTTIN 后台程序要从终端读取成数据时。 进程暂停
SIGTTOU 后台终端要把数据写到终端时。 进程暂停
SIGURG 一些紧急的事件,比如从网络收到带外数据。 忽略
SIGUSR1 用户自定义信号 进程终止
SIGUSR2 用户自定义信号 进程终止
SIGVTALRM 有setitimer产生。 进程终止

⑻ Linux中的kill与kill -9

1、我们经常会用到kill命令去杀死一个进程,但是有时会出现kill不成功山帆尘的现象,这是就要用到kill -9。

2、之所以这两个命令会有区别是因为所发送的 信号(Signal) 是不同的:

默认情况下kill命令的参数为-15,如下逗禅图所示:

kill -15代表的信号为SIGTERM,这是告诉进程你 需要被关闭,请自行轿悉停止运行并退出 ;

而kill -9代表的信号是SIGKILL,表示进程被终止,需要 立即退出 ;

3、因此kill -9表示强制杀死该进程,这个信号 不能被捕获也不能被忽略 。

⑼ Linux C函数Kill

你是程序中调用kill函数,还是在命令行调用kill命令?
int kill(pid_t pid, int sig); 函数有两个参数,一个是进程号,一个是信号
如果你输入的进程号是正确的,而进程还在,则信号有可能被该进程忽略了,不知道你发送的信号是几号? 只有SIGKILL SIGSTOP不能被忽略,其它都可以忽略或捕捉。

热点内容
配置中心应急流程有哪些 发布:2025-05-15 02:37:31 浏览:668
php宏定义 发布:2025-05-15 02:32:54 浏览:270
咸鱼支付密码哪里改 发布:2025-05-15 02:32:53 浏览:520
存储机箱 发布:2025-05-15 02:31:31 浏览:836
编程很累吗 发布:2025-05-15 02:29:25 浏览:552
疫情期间访问国外网络 发布:2025-05-15 02:24:24 浏览:247
我的世界网易版游戏服务器 发布:2025-05-15 02:23:46 浏览:221
全球编程网站 发布:2025-05-15 02:22:55 浏览:334
编程猫知乎 发布:2025-05-15 02:18:00 浏览:631
服务器转接搭建 发布:2025-05-15 02:12:50 浏览:518