gpt4 book ai didi

c - 将由信号更改的变量发送到子进程中由 exec 创建的进程。[C]

转载 作者:行者123 更新时间:2023-11-30 16:50:04 25 4
gpt4 key购买 nike

因此,我正在创建一个信号处理程序来修改输出打印到屏幕的速度。输出是通过一个进程完成的,该进程打印到另一个打开的终端,同时仍然允许用户输入“+”以提高读取速度,“-”以降低速度。

代码看起来像这样。

static state* start_button(void)
{
state *destination;

pid_t pid;
pid = fork();
switch(pid)
{
case -1:
destination = &ready;
break;
case 0:
execl("./outputTerminal",
"outputTerminal",file_number,"/dev/ttys001",NULL);
break;
default:
destination = &going;
break;
}

return destination;
}

在运行状态(going.c)中,我的思维过程是创建 volatile 变量秒和纳秒,并使用这些变量来更新outputTerminal的nanosleep()函数用于一次读取一行,如下面的代码片段所示。这可能吗?顺便说一句,这是一个家庭作业问题。我让所有函数都像预期的那样工作,我只需要弄清楚如何将信号更改的变量发送到该进程。在设置信号处理程序后,我尝试在运行状态下执行 kill(baby_pid,SIGUSR1) 因为我保存了 pid,但这只是出于某种原因杀死了进程 outputTerminal。

 //going.c
volatile sig_atomic_t seconds;
volatile sig_atomic_t nanoseconds; //Update these in the going state

//Then pass them to the process outputTerminal like so


//outputTerminal.c
struct timespec tm1,tm2;
tm1.tv_sec = seconds;
tm2.tv_nsec = nanoseconds;
nanosleep(&tm1,&tm2);

这是我的信号处理程序

static void speed_handler(int signal)                                          
{
long max_nano = 1000000000L;
long incrementer = 250000000L;
if(speed_control == 0)
{
if(nanoseconds == 0L && seconds > 0)
{
seconds -= 1;
nanoseconds = max_nano;
}

if(nanoseconds != 0L)
nanoseconds -= incrementer;
}

if(speed_control == 1)
{
nanoseconds += incrementer;
if(nanoseconds >= max_nano)
{
nanoseconds = 0L;
seconds += 1;
}
}
}

最佳答案

您正在寻找的称为 IPC,是进程间通信的缩写,有很多方法可以实现您想要的功能。您的方法不起作用,因为您的进程具有不同的地址空间,因此更改一个进程中的变量不会对另一个进程产生影响。

从一个进程向另一个进程传递信息的几种方法:

还有很多机制,但这应该可以帮助您入门。

关于c - 将由信号更改的变量发送到子进程中由 exec 创建的进程。[C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42353219/

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