Tag: 信号

不想立即删除终止子进程,需要成为僵尸

我从SE QUE获得以下信息明确地将SIGCHLD的处置设置为SIG_IGN会导致随后终止的任何子进程立即从系统中删除而不是转换为僵尸。 据我所知,要读取子状态,需要在进程表中使用子进程。 因此有必要在进程表中使用zombie子进程来读取子状态。 所以我想编写信号处理程序,它将删除“将SIGCHLD的处置设置为SIG_IGN” 我使用下面的代码(在fork之前)以避免在终止后立即删除子进程:但我仍然无法获得子状态并且waitpid使用ECHILD返回-1。 #include #include #include #include #include #include static siginfo_t sig_info; static volatile sig_atomic_t sig_num; static void *sig_ctxt; static void catcher(int signum, siginfo_t *info, void *vp) { sig_num = signum; sig_info = *info; sig_ctxt = vp; } static void set_handler(int signum) { struct sigaction sa; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = catcher; […]

如何检测C中的变量uninitialized / catch段错误

我目前有一个程序,我需要测试作为参数传入的变量是否未初始化。 到目前为止,似乎在C中这很难做到,所以我的下一个想法是调用信号处理程序来捕获段错误。 但是,我的代码在尝试访问未初始化的变量时没有调用信号处理程序,如下所示: void segfault_sigaction(int signal, siginfo_t *si, void *arg) { printf(“Caught segfault at address %p\n”, si->si_addr); exit(0); } void myfree(void*p, char * file, int line){ struct sigaction sa; memset(&sa, 0, sizeof(sigaction)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = segfault_sigaction; sa.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); char up = *((char*)p); //Segfault 编辑:在Linux系统上

SIGCHLD导致分段错误,而不是进入处理程序

我正在尝试创建一个简单的shell,并添加了使用&在后台运行进程的function。 在我的主要方法中,我基本上有: int main() { if (signal(SIGCHLD, handle) == SIG_ERR) perror(“Cannot catch SIGCHLD”); pid_t child = fork(); if (child == 0) execvp(command, arguments); else { if (background == 1) { printf(“1”); backgroundList(command, child); printf(“2”); } else waitpid(child, NULL, 0); } } 对于我的经纪人,我有: void handle(int s) { printf(“a”); if (signal(SIGCHLD, handle) == SIG_ERR) perror(“Cannot catch SIGCHLD”); […]

在虚拟shell中处理CTRL-C

我正在编写一个虚拟shell,当用户输入ctrl-C时它不应该终止,但是应该只生成一个新的提示行。 目前,当我输入ctrl-C时,我的shell不会终止,但它仍然不会打印新的提示行。 你知道为什么会这样,我怎么解决这个问题? 我的代码如下: #include #include #include #include #include #include #include #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } void INThandler(int sig) { printf(“\n> “); signal(sig, SIG_IGN); } int main(void) { char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; int retStatus; size_t nargs; pid_t pid; printf(“$dummyshell\n”); signal(SIGINT, INThandler); […]

Linux和实时信号

我正在尝试编写在Linux中使用实时信号的简单程序。 但我遇到了奇怪的行为,首先是代码: #include #include #include #include #include”errhandling.h” #include #include #include void baz(int sig,siginfo_t* info,void *context) { if (sig==SIGUSR1) printf(“SIGUSR1 %d\n”,info->si_value.sival_int); else if(sig==SIGRTMIN) printf(“SIGRTMIN %d\n”,info->si_value.sival_int); else printf(“SIGRTMIN+1 %d\n”,info->si_value.sival_int); return ; } void sig_output() { sigset_t set; sigprocmask(0,NULL,&set); printf(“blokowane sa: “); if (sigismember(&set,SIGUSR1)) printf(“SIGUSR1 “); if(sigismember(&set,SIGUSR2)) printf(” SIGUSR2″); printf(“\n”); return ; } int received=0; int usr2=0; void […]

在错误的线程中调用信号处理程序

我想知道是否有可能中断主线程并要求它执行一些回调。 主线程应该继续完成回调后的操作。 例如,我们有2个线程t1和m1(主线程)。 t1将中断m1(主线程)并要求它用一些参数调用一个函数。 m1(主线程)将停止执行之前的操作并将开始执行该function。 完成function后,它将恢复到之前的function。 我想复制硬件中断的作用。 我有一个线程从文件中读取数据。 然后它应该要求主线程调用一个函数。 主线程将做一些事情。 它应该停止这样做并开始执行该function。 完成后,主线程应该继续它正在做的事情 我使用信号编写了以下代码 #include #include #include #include static void catch_function(int signo) { int id = GetCurrentThreadId(); printf(“\nThread ID is %d”,id); signal(SIGINT, catch_function); } DWORD WINAPI MyThreadFunction( LPVOID lpParam ) { int id = GetCurrentThreadId(); printf(“\nChild Thread ID is %d”,id); while(1) { Sleep(50); if (raise(SIGINT) != […]

使用条件变量和互斥量来同步C中的线程

根据评论者的要求编辑。 该程序创建两个线程。 每个线程从两个特定输入文件中的一个读取,每个输入文件包含一行字母或每行代码一个’0’。 线程应该将字母读入全局字符数组,然后打印出来。 问题是,在达到’0’时,活动线程必须将控制转移到另一个线程,该线程在该线路上不应该为’0’。 (我们确信,如果文件1在一行上有一个’0’,那么相应行上的文件2就有一个字母。多个零可以互相跟随,多个字母也可以。) 文件一 h 0 h 0 h 0 h 0 h 0 文件二 0 i 0 i 0 i 0 i 0 i 我正在尝试使用pthread互斥锁定/解锁以及信号并等待使其工作。 但是,我一直处于僵局状态。 有两个线程。 目前,它们彼此镜像意味着它们执行相同的操作,只是使用不同的文件和相反的条件。 线程示例: char final[1001]; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condition1 = PTHREAD_COND_INITIALIZER; pthread_cond_t condition2 = PTHREAD_COND_INITIALIZER; int w = 1; void *get() { //start […]

为什么不能触发子进程中的信号处理程序?

我的目的是为fgets创造1秒的时间。 如果在1秒内未收到任何输入,则程序终止。 我想出的设计是:父级为SIGALRM注册一个信号处理程序。 然后它会分叉一个触发SIGALRM的孩子,然后继续调用fgets。 SIGALRM将触发杀死父进程的处理程序。 但是当我在64位的ubuntu 14.04上执行此操作时,处理程序不会被触发,程序只是等待用户永远输入fgets。 为什么会发生这种情况,我该如何解决这个问题? #include “csapp.h” void handler() { printf(“lazy man\n”); kill(SIGKILL, getppid()); exit(0); } int main() { char buf[100]; signal(SIGALRM, handler); pid_t pid; if ((pid = fork()) == 0) { alarm(1); } else { fgets(buf, 100, stdin); printf(“%s”, buf); } return 0; } 〜

正确关闭C应用程序以确保完成CRITICAL部分的方法?

我有一个在SINGLE线程C应用程序中定义的关闭钩子处理程序。 int main(int argc, char * argv[]){ //Shutdown hook for CTRL-C (void) signal(SIGINT, shutdownHook); … … } 因此,当用户点击CTRL-C时,启动关闭挂钩… void shutdownHook(int sig){ rc = wmq_sender_stop(errorStr); if (rc != 0){ printf(“\n%s\n”, errorStr); } while(transactionRunning == TRUE){ sleep(1); printf(“Transaction still running\n”); } …. …. } 您可以在上面看到我调用“wmq_sender_stop”例程(在共享库中),它基本上将变量设置为FALSE以结束该共享库中的循环。 int wmq_sender_stop(char errorStr[ERROR_STR_LEN]){ running = FALSE; … } 并且该变量“running”将停止(希望)在该共享库中运行的主循环。 while(running == TRUE){ […]

C信号处理程序被所有子进程激活

我需要某种signal_handler,当按下CTRL + C时,程序暂停所有操作并询问用户:«你确定要终止(Y / N)吗?»如果答案是y,程序终止,如果这是程序继续/升级它的function,这是我到目前为止所拥有的: void sig_handler(int sig){ if(sig == SIGINT){ char res; printf(“\nAre you sure you want to terminate (Y/N)?\n”); kill(0, SIGTSTP); //envia sinal Stop ao processo pai do{ read(STDIN_FILENO, &res, 1); if (res == ‘Y’ || res == ‘y’) { kill(0,SIGTERM); //envia sinal de Terminacao ao proceso pai }else if (res == ‘N’ […]