‘壹’ 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函数。