gpt4 book ai didi

在 C 中修改信号处理程序中的值时出现混淆

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:29 25 4
gpt4 key购买 nike

我正在尝试测试进程捕获信号的速度,因此我编写了一个简单的 C 代码。

在我的代码中,我 fork N 个进程,每个子进程注册一个处理程序,该处理程序由 SIGUSR1 触发并等待信号 SIGUSR2。捕获 SIGUSR1 和 SIGUSR2 之间的等待时间是我想要的。我试图先记录将 SIGUSR2 捕获到共享内存或全局随机变量的时刻。

我遇到的问题是我无法修改全局变量或共享内存的值。另一件事也让我感到困惑,我还在主进程中设置了一个计时器,它也使用 SIGVTALRM 来触发处理程序并修改全局变量。但它有效。

这是我的代码,感谢您的帮助!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#include <sys/shm.h>

#define N 3
#define SHMSIZE 20

int count = 0;
int record[N];
char* shm;
int test = 0;

void timer_handler(int signum)
{
++count;
}

void handler2 (int signum)
{
printf("%d ends, use %d usecs.\n", getpid(), count);
*shm = count;
test+=1;
}

void handler (int signum)
{
signal(SIGUSR2, handler2);
printf("%d begin \n", getpid());
kill(getpid(),SIGUSR2);
}

void child(int process_index)
{
struct sigaction sa;

/* Register */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sigaction(SIGUSR1, &sa, NULL);

printf("I am %d.\n", getpid());
sleep(3);

exit(0);
}

int main()
{
int i, k, status, shmid;
pid_t pid[N];
pid_t pid_wait;
struct sigaction sa_main;
struct itimerval timer;
key_t key = 123;
char* shm;

/* Create shared memory */
if ((shmid = shmget(key, SHMSIZE, IPC_CREAT|666)) <0)
{perror("shmget"); exit(1);}

/* attach shm */
if ((shm = shmat(shmid, NULL, 0)) == (char*)-1)
{
perror("shmat");
exit(1);
}

/* Init Shm Value */
*shm = '0';

/* Register */
memset(&sa_main, 0, sizeof(sa_main));
sa_main.sa_handler = timer_handler;
sigaction(SIGVTALRM, &sa_main, NULL);
signal(SIGUSR1, SIG_IGN);

/* Config timer */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 1;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 1;

/* Start a virtual timer */
setitimer( ITIMER_VIRTUAL, &timer, NULL);

printf(" Main pid is:%d\n", getpid());
/* Do k times */
for (k=0;k<3;k++)
{

for (i=0;i<N;i++)
{
pid[i] = fork();
if (pid[i]==0)
{
child(i);
}
}

sleep(2);
kill(0, SIGUSR1);

for (i=0;i<N;i++)
{
do
{
pid_wait = waitpid(pid[i], &status, WNOHANG);
printf("I am waiting..\n");
sleep(1);
}while(pid_wait != pid[i]);
}

printf("the record is: %d\n", *shm);
printf("test is:%d\n", test);
}
printf("all done\n");

/* Detach shared memory */
shmdt(shm);

/* destroy shared memory */
printf("shared memory destroyed!\n");
int retval = shmctl(shmid, IPC_RMID, NULL);
if (retval <0)
{
fprintf(stderr, "remove shared memory fail..\n");
exit(1);
}

return 0;
}

最佳答案

我注意到如果不将共享内存作为参数传递,我就无法修改值。因此,我的解决方案是将修改后的全局值从处理程序传递给子进程,并修改共享内存。

感谢您的帮助!

关于在 C 中修改信号处理程序中的值时出现混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com