『壹』 c語言退出問題
你的要求只有一個辦法可以實現,那就是信號。編寫信號程序需要一定的基礎,不知道你有沒有這個基礎。
如果你有了基礎,那看下我下面的例子,很簡單的例子,注釋也很詳細,如果你對信號一無所知,那我就沒轍了,除了信號我想不到其它辦法幫你完成這個東西。樓上幾位的ctrl+c其實就是一個信號,但那個是採用系統默認的信號,並不是自己定義的。
下面的例子採用了linux系統調用的內容,在windows下不能運行,如果你想跨平台,建議你看看C語言庫函數中的信號章節。
信號接收程序
#include "stdio.h"
#include "signal.h"
#include "sys/types.h"
#include "unistd.h"
void new_op(int, siginfo_t *, void *);
int main(int argc, char**argv) {
struct sigaction act; //用於創建新信號
struct sigaction old_act; //舊的信號
int sig;
sig = atoi(argv[1]); //第一個參數變成信號的標志,以15做第一個參數,因為信號個數有限制,且某些信號是不能從載的,例如9號信號
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = new_op; //新的信號定義的操作是new_op函數
if(sigaction(sig, &act, &old_act) < 0) { //開始從載信號
printf("install sigal error\n");
return 1;
}
while(1) {
sleep(2);
printf("Now we wait for signal\n");//信號安裝完畢,應用程序就可以自己開始執行
}
}
void new_op(int signum, siginfo_t * info, void * myact) {//信號制定的函數
printf("recive signal %d\n", signum);
exit(1);//退出
}
信號發送程序
#include "stdio.h"
#include "sys/types.h"
int main(int argc, char ** argv) {
pid_t sig = atoi(argv[1]); //進程PID標識號做第一個參數
printf("we send sig to %d\n", sig);
sigqueue(sig, 15, NULL); //15號信號發送,如果你安裝的不是15號,就指定安裝的信號
}
程序不要在windows下編譯,是通過不了的,因為我用的是linux系統調用。不過原理差不多了,換成C庫函數實現不是很難,但我賴的去看C庫函數關於信號的章節。
以上是源代碼,如果沒看懂,稍微看下我下面介紹的原理
原理:每個進程都有自己的信號表,信號是軟體對硬體中斷的一種模擬,他大致過程是這樣的,進程安裝好信號表後,會在特定的時間去檢查自己是否有信號要相應(根據不同的操作系統可能不同),在linux下,進程每次由中斷現場返回到用戶空間時候都會檢查自己是否有信號要響應,有的話就執行自己制定的操作,ctrl+c就是採用了默認的信號相應和kill 進程PID相似。
只能介紹這么多了,因為信號是個比較多的內容。僅僅是個回帖不能介紹太多,你自己去查相關的章節就能弄明白。
『貳』 C語言:程序出現錯誤「storage size of 'xx' isn't known 」怎麼辦
1,手頭沒有unix 機器。如果包含了 io.h 還找不到,可以自己用 typedef 定義一個。
2,結構內容可能有:struct _finddata_t{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;char name[_MAX_FNAME]}。
3,gcc test.c按照默認進行編譯,無錯誤。
5,在#include <signal.h>之後顯式添加sigaction的頭文件,#include <bits/sigaction.h> 1
6,這樣編譯器會顯式的編譯sigaction的定義,但是這種情況下需要注意,#include<bits/sigaction.h>必須在#include <signal.h>之後,因為signal中會通過#error進行預處理,檢查`bits/sigaction.h是否包含, 如果用戶沒有包含的話,預處理階段就會報錯。
7,你根據程序里用到的它的成員名字,自己假設和定義就可以了。
『叄』 APUE裡面守護進程捕捉信號的這個程序這兩句什麼意思(C語言)
唯一的區別是->前面放的是指針,而.前面跟的是結構體變數,如已定義了一個結構體struct student,裡面有一個int a;然後有一個結構體變數struct student stu及結構體變數指針struct student *p;且有p=&stu,那麼,p->a和stu.a表示同一個意思。
『肆』 linux C信號發送和接收sigaction()和pthread_kill()怎麼不行呢
1. 默認情況下,信號將由主進程接收處理,就算信號處理函數是由子線程注冊的
2. 每個線程均有自己的信號屏蔽字,可以使用sigprocmask函數來屏蔽某個線程對該信號的響應處理,僅留下需要處理該信號的線程來處理指定的信號。
3. 對某個信號處理函數,以程序執行時最後一次注冊的處理函數為准,即在所有的線程里,同一個信號在任何線程里對該信號的處理一定相同
4. 可以使用pthread_kill對指定的線程發送信號
APUE的說法:每個線程都有自己的信號屏蔽字,但是信號的處理是進程中所有的線程共享的,
這意味著盡管單個線程可以阻止某些信號,但當線程修改了與某個信號相關的處理行為後,所
有的線程都共享這個處理行為的改變。這樣如果一個線程選擇忽略某個信號,而其他線程可
以恢復信號的默認處理行為,或者為信號設置一個新的處理程序,從而可以撤銷上述線程的
信號選擇。
進程中的信號是送到單個線程的,如果信號與硬體故障或者計時器超時有關,該型號就被發
送到引起該事件的線程中去,而其他的信號則被發送到任意一個線程。
sigprocmask的行為在多線程的進程中沒有定義,線程必須使用pthread_sigmask
總結:一個信號可以被沒屏蔽它的任何一個線程處理,但是在一個進程內只有一個多個線程共用的處理函數。
『伍』 C語言中sigaction是ISO標准函數嗎
不是,C11沒有。sigaction是POSIX函數。
『陸』 用純C語言 怎樣編程,解析HTTP協議。
按照HTTP協議的規定,理清楚相關功能。
然後軟體模型的方式解釋HTTP的運行過程,可以使用UML語言。
然後將UML語言轉換成C語言即可。
『柒』 在c語言中常量在程序中不需要進行說明就能夠使用
是的
常量可以直接使用。不需要任何處理
『捌』 C語言sigaction函數問題
unistd.h不是c語言的東西,是linux/unix的系統調用,包含了許多 U N I X系統服務的函數原型,例如 r e a d,
w r i t e和getpid函數。