所以我創建了一個信號處理程序來修改輸出打印到屏幕的速度。輸出通過打印到另一個打開的終端的過程來完成,同時仍然允許用戶輸入諸如'+'的輸入以提高其讀取的速度,' - '以降低速度。發送一個由信號改變的變量給exec在子進程中創建的進程[C]
代碼看起來像這樣。
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
)我的思維過程是創建易失性變量秒和納秒,並使用這些變量來更新outputTerminal使用在像這樣在一個時間讀取線1線nanosleep()
功能下面的代碼片段。這可能嗎?這是一個家庭作業問題btw。我擁有所有功能,就像我們應該只需要弄清楚如何將由信號更改的變量發送到該過程一樣。在設置信號處理程序之後,我試圖在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;
}
}
}
因此,我修改了它實際上假設的代碼。只需創建一個孩子並使用execl。我們顯然只是假設使用這種信號,這對我來說沒有意義。 Sigqueue看起來好像很不錯,但顯然它不支持mac sierra – WizKiz
好吧,所以我解決我的問題的方法是將信號處理程序放在打印出另一個終端上的文本的過程中,然後使用我的父進程發送信號給它,我用兩個信號來提高速度和降低速度。 – WizKiz
@WizKiz「古典」信號的一個問題是,人們不確定目標進程是否接收到信號(並且人們不確定如果信號快速連續發送多次會發生什麼情況)。 – cnicutar