- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在学习 Linux(Ubuntu) 上的信号和进程,并用 C 语言编写简单的程序。
这是代码。
#define _XOPEN_SOURCE 500
#include <ftw.h>
#define MAXFD 20
#include <unistd.h>
#include <stdio.h> // standard input/output
#include <stdlib.h>
#include <string.h> // string operations
#include <dirent.h> // dirent
#include <sys/stat.h> // filestat
#include <errno.h> // errno
#include <time.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#define ERR(source) (perror(source),\
fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
kill(0,SIGKILL),\
exit(EXIT_FAILURE))
volatile sig_atomic_t last_signal = 0;
int sig_count=0;
void usage(char *name){
fprintf(stderr,"USAGE: %s t \n",name);
fprintf(stderr,"t - how often send SIGUSR1 signals\n");
exit(EXIT_FAILURE);
}
void sethandler(void(*f)(int),int sigNo){
struct sigaction act;
memset(&act,0,sizeof(struct sigaction));
act.sa_handler = f;
if (-1==sigaction(sigNo,&act,NULL)) ERR ("sigaction");
}
void countSigHandler(int sig){
sig_count++;
printf("Parent received a total of %d SIGUSR2\n",sig_count);
}
void sigchld_handler(int sig) {
pid_t pid;
for(;;){
pid=waitpid(0, NULL, WNOHANG);
if(pid==0) return;
if(pid<=0) {
if(errno==ECHILD) return;
ERR("waitpid");
}
}
}
void child_work(int t){
struct timespec ts = {0,t};
int i=0;
sethandler(SIG_DFL,SIGUSR1);
for (i=0;i<10;i++){
//nanosleep(&ts,NULL);
sleep(t);
if (kill(getppid(),SIGUSR1)) ERR("kill");
//if (kill(getppid(),SIGUSR1)) ERR("kill");
printf("[%d] sending SIGUSR1 to %d\n",getpid(),getppid());
}
}
void parent_work(){
return;
}
int main(int argc, char** argv) {
int t;
t = atoi(argv[1]);
sethandler(sigchld_handler,SIGCHLD);
sethandler(countSigHandler,SIGUSR1);
pid_t pid;
if ((pid=fork())==-1)ERR("fork");
if (pid==0) child_work(t);
else {
if (kill(0,SIGUSR1)) ERR("kill");
//parent_work();
//while(wait(NULL)>0);
}
return EXIT_SUCCESS;
}
当我使用 t 为 1 从终端(编译文件)运行它时,它会将我注销,我必须再次输入密码才能登录(而且当我重新登录时所有程序都关闭)。
如果我评论 child_work 中使用 kill 发送信号的行,它运行正常。
这是怎么回事?你能帮帮我吗?
最佳答案
我想我明白了。我修改了代码以删除所有杀戮但添加了 PID 打印。这是 t=0 的序列:
I am 12684
pgid=12684 // I printed the PGID to be sure
[12685] sending SIGUSR1 to 12684
[12685] sending SIGUSR1 to 11451
(…) // same line repeated, from the for loop
当 t=1 时,它直接是 11451。你是对的,因为在我的 PID 11451 session 进程中是:
init --user
以我的用户身份开始。所以我可以向它发送信号。所以是的,在父亲去世后, child 被附加到 init,这里是“我的”init,所以 getppid()
指向它并且代码杀死了 init!
如果您重新激活 wait()
循环,输出会有所不同,因为我只看到父亲的 PID(当然没有真正杀死父亲还活着)。
不确定为什么使用这个“私有(private)”初始化(不要关注 Ubuntu 中最近的更改)。知道这一点,并为了防止这种行为,我建议在进程开始时(在任何 fork 之前)存储 PID,并在子进程之后使用这个存储的值。这样您就可以确保“杀死”正确的目标,或者如果父亲因任何原因死亡,则不会杀死任何人。
关于c - 使用 kill 向父进程发送信号让我退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33586850/
一个观察:当我在 android 上开发我的应用程序时,我注意到 LogCat 中有以下两行。这些发生是因为我自己的应用程序的内存需求太多。我读过 Android 可以决定何时摆脱不需要或由于内存需求
SIGINT有什么区别信号和 SIGTERM信号?我知道SIGINT相当于在键盘上按Ctrl+C,但什么是SIGTERM为了?如果我想优雅地停止一些后台进程,我应该使用哪些? 最佳答案 响应的唯一区别
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 启动)在 Linux 上运行。进一步假设存在一些父子都可以修改的共享内存。 在父进程的上下文中,我想停止子进程并知道它实际上已
所以我最近了解到 kill is not a synchronous命令,所以我在 bash 中使用这个 while 循环,这很棒: while kill PID_OF_THE_PROCESS 2>/
我遇到了一个问题。我们有一个干净的脚本用来清理旧文件,有时我们需要停止它,稍后再启动它。像下面的过程。我们在check.sh中使用kill -STOP $pid和kill -CONT $pid来控制c
内核中谁负责终止进程。 如果“kill”来了,进程处于阻塞状态怎么办。 kill是否等到进程进入running状态才清理自己。 如果有人可以在内核方面回答更多问题,例如当 kill 命令生成 SIGI
在下面的链接中 http://www.faqs.org/docs/Linux-HOWTO/NFS-HOWTO.html 它说一个进程除非被“sure kill”才能杀死,但是什么是sure kill?
我正在尝试编写一个快速的 bash 脚本,以在脚本检测到的特定条件下向程序发出信号,并且出于习惯,我正在使用某些 bin 实用程序的完整路径,即 /bin/rm 和 /bin/kill 代替 rm 和
我的服务器在端口 80 上运行 nohup。我试试 ps aux | grep nohup 得到 root 9234 0.0 0.1 11740 932 pts/1 S+ 15:19 0:00 gre
我写了下面的脚本,如果 grep 在文件中找不到相关的字符串,它会启用 20 秒的超时。 脚本运行良好,但是脚本的输出是这样的: ./test: line 11: 30039: Killed 如何从
基本上我想要一个 bash 脚本进程,在收到 SIGINT 后,在退出之前杀死它的所有子进程。我读了here使用以下内容: trap "kill -TERM -$$ ; exit 1" INT QUI
我有一个名为 Launcher.sh 的 shell 脚本,它由 java 进程执行。 java进程内部使用ProcessBuilder来执行bash脚本。 在 Launcher.sh 中,我有以下代
上下文 我创建了一个调用 celery 任务的 Django 应用程序,该任务又会生成其他任务并等待它们完成。 工作流程如下: 1) 主要的python/django代码在后台启动一个celery任务
我要输出这条消息/usr/local/ex1.sh: line xxx: Killed ex2.sh >> $LOG_FILE 2>&1到日志文件。 不过 “ex1.sh”输出 /usr/local
我最近上传了很多问题,我认为人们对我感到厌倦,但我不擅长编程,并且正在尝试为 A-level 类(class)编写游戏代码,所以我需要所有可以得到的帮助来学习语言。不管怎样,我将在下面展示一些相关的代
hadoop job -kill job_id 和 yarn application -kill application_id 有什么区别? job_id 和 application_id 是否代表/
在我的 post-command-hook回调,当我这样做时 kill-word , this-command var 是 kill-region - 而不是 kill-word正如预期的那样。 我想
我有一个要在 Oracle Linux OS 上运行的 C++ 应用程序。 考虑一下,我用 new 创建了几个对象。运算符(operator)。虽然我已经使用 delete 操作符来解除分配它,但是
不确定是否相关,但在周末我将我的操作系统升级到 Big Sur 11.1 版,然后当我开始工作时,一件又一件地出错,现在我根本无法使用 node 或 npm。我在 zsh 中收到以下消息: % nod
我使用 python 并行启动两个子进程。一个是 HTTP 服务器,而另一个是另一个程序的执行(CustomSimpleHTTPServer.py,它是由 selenium IDE 插件生成的 pyt
我是一名优秀的程序员,十分优秀!