WEXITSTATUS这个函数是做什么的?
WEXITSTATUS是一个检验子进程退出的正常还是非正常和返回值的宏WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。WEXITSTATUS(status) 当WIFEXITED返回非零值时,可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。扩展资料:子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:WIFEXITED(status)如果若为正常结束子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传给exit或_eixt的低8位。WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。参考资料:百度百科-waitpid
分析linux系统中利用fork系统调用创建子进程的几个要点。
该函数被调用一次,但返回两次。
子进程的返回值是0,父进程的返回值则是子进程的进程I D。
子进程复制父进程的地址空间,文件描述符等。这种复制是copy-on-write。子进程不继承父进程的锁。
通常在fork()之后,会调用exec函数族,这样子进程里面的东西就跟父进程不一样了。
父进程则通常会调用wait()或者waitpid()等待子进程退出,做一些回收资源的工作。如果在子进程结束之前,父进程结束了,子进程就会交由init进程托管。
c程序 中wait:什么意思
C语言wait()函数:结束(中断)进程函数(常用)相关函数:waitpid, fork头文件:#include #include 定义函数:pid_t wait (int * status);函数说明:wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数 status 可以设成NULL. 子进程的结束状态值请参考waitpid().返回值:如果执行成功则返回子进程识别码(PID), 如果有错误发生则返回-1. 失败原因存于errno 中.范例#include #include #include #include main(){ pid_t pid; int status, i; if(fork() == 0) { printf("This is the child process. pid =%d\n", getpid()); exit(5); } else { sleep(1); printf("This is the parent process, wait for child...\n"; pid = wait(&status); i = WEXITSTATUS(status); printf("child's pid =%d . exit status=^d\n", pid, i); }}执行:This is the child process. pid=1501This is the parent process, wait for child...child's pid =1501, exit status =5
linux 怎么调用内核导出的函数
Linux内核没有导出的函数不能调用,即使包含了头文件,也会出现符号未定义的警告,并在加载模块时失败。
以下是我的测试例子:
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Linmiaohe");
MODULE_DESCRIPTION("try to evole sys_umount");
extern asmlinkage long sys_umount(char __user *name, int flags);
static int __init sys_umount_init(void)
{
sys_umount("./proc",0);
return 0;
}
static void __exit sys_umount_exit(void)
{
printk(KERN_INFO "***********sys_umount module has been unregistered*************\n");
}
module_init(sys_umount_init);
module_exit(sys_umount_exit);
有关linux的几个疑惑,请教了
1、为何说linux安全性和稳定性在先天上比windows好,能说下具体理由吗?如果是因为开源的关系。如果windows也开放源码,那以上两个特点是否比linux还好呢。
具体的理由牵扯到比较技术性的问题,不好理解,也不容易说清楚。但首先反驳LS诸位,Linux确实比Windows安全,而且这种安全性并不是建立在Linux用户少或者Linux不能运行Windows程序上这么简单的。Linux用户真的少么?一点不少,除了家用电脑之外,你见到的几乎所有智能化平台(包括PlayStation一类的游戏机)几乎都是Linux的衍生版系统。而且就病毒攻击的价值来讲,试想一下:攻击一千台Windows系统的个人电脑能获得多少利益?而攻击一个Linux系统的大型服务器能获得多少利益?可想而知,其实攻击Linux平台应该是更有价值。但在此基础上,Linux依然比Windows安全。
说到开源,已经有专门的漏洞测试机构做出过专业的测试来证明:同类型软件对比,开源软件漏洞远远低于闭源软件。这一点的确增加了Linux的安全性,但还不是本质——即便Windows开源,他也不会有太大的安全性提高,这是系统本身结构决定的。这一点其实一味的指责微软也是不太公平的,因为Windows系统从一开始的定位就是没有技术水平的个人用户,所以这个系统是牺牲一定的安全性和稳定性来换取个人用户更重视的易用性。
各有所长,Linux要的是安全稳定,而Windows要的则是简单易用。
2、我们常见redhat、红旗linux。。。等厂家推出linux,请问他们的这些linux和是否是在linux内核上增加了一些软件就形成了他们自己的linux。如果是这样,假如有个叫小明,也在linux内核上做一些删减,是否也可以叫‘小明linux’呢?请问redhat等是否也是免费的、开源的。目前最流行的linux是哪一家的,为什么这个linux最流行。
通常所属的Linux只是个内核,就是一套系统运行的内部代码。操作系统的作用书连接用户与硬件,因为用户无法直接操纵硬件——你不可能手动给CPU输入信号吧~~而操作系统的内核就是用户操作硬件的一部分工作,用户还是无法直接接触,用户接触到的都是应用层的东西。所以你说的那些linux,都是做了自己特定的应用层设定,也有相应的驱动层(内核在驱动层,但驱动层不只是内核)的改动,但一般不会动Linux内核的东西——这部分是由Linux之父Linus先生带领一个团队在专门维护的。至于你说的“小明Linux”——完全没问题,这个随意!
Linux内核是开源免费的,但Linux的发行版并不全是(虽然大部分是)。RedHat原来既有开源版发布也有收费的闭源版发布,但后来把开源版交给社区去维护了——就是现在的Fedora,自己专心作收费的闭源版——RHEL。类似的收费版还算有SUSE的企业版Linux以及红旗Linux企业版。但SUSE和红旗也有免费的开源版
3、linux和windows生命力哪个更长,有人能预测下吗?理由?
就目前来看,Linux的生命力不可估量,开源的就是全人类的,即便有一天创始人Linus先生不在了,即便有一天Linux项目消失了,即便有一天Linux这个名称不再有人使用了。但Linux开源的代码一定会被后来者所继承。
总有人对开源这种行为品头论足,褒贬不一。但牛顿说过:“如果说我比别人看得更远些,那是因为我站在了巨人的肩膀上。”开源的意义并不在于一定能在现在给我们什么既得利益,而是在于为后世提供了这样一个“巨人的肩膀”。
至于Windows的生命力不做评价。但想想——如果比尔盖茨不在了呢?如果微软公司倒闭了呢?如果Windows项目消失了呢?我坚信——开源既是永生,闭源的再长寿也有寿终正寝的一天。
========================================================
新手学习一般推荐Ubuntu,简单易学,也有庞大的用户群和完善的文档供交流学习。
一般语言不是问题,因为Linux的开源意味着全世界共同维护,那中文作为全世界最多人作为母语的一种语言,基本上所有常见发行版都会包含中文语言包。
最新的Ubuntu 10.10以及以后的版本更是把中文作为了系统默认语言之一。
其他新人比较容易上手的衍生版还有红旗Linux,和Fedora
其实Fedora相比另外两个更难一些,但Fedora是以Redhat为基础
(Ubuntu是以Debian为基础的,这是Linux衍生版中差异比较明显的两个重要分支。一些命令和安装包格式都不太相同)
而Redhat是被大型服务器所广泛使用的
所以如果想以后学习服务器的一些相关知识,建议从Fedora入手会更方便。
linux中C语言关于进程的创建
/*请解释一下*/
while(((child=wait(&status))==-1)&(errno==EINTR));
这种的目的是父亲进程等待子进程结束,并回收子进程的资源,将子进程的退出状态存储在status中,同时,返回该子进程的pid。
如果wait函数返回-1表示wait函数被其它情况打断返回,并没有等待到子进程结束,而同时判断errno的值是不是EINTR(意思是让你try again),那么,让进程继续等待。因为这个错误并不是真正wait错误,而是被timeout时间等造成的,因此重新等待。而如果是其它情况,显然是wait函数调用错误,即下面的if(child==-1),需要打印错误信息。‘
//但你这句应该写错了。应该是逻辑与而不是位与操作。即
while(((child=wait(&status))==-1)&&(errno==EINTR));
/*请解释一下*/
if(child==-1)
你对信号处理部分还需要努力。
另外介绍一本书《Linux高级程序设计 第3版》 上面讲得很清楚。
有问题我们继续交流,一起学习。
更多技术文章可以关注我的微博,名字:成都睿尔科技 。
Linux下的c编程:系统调用
标准的c函数库是所有的编译都要具有的函数库,(实际上还是略有不同),但是这些基本上实现方法略有不同,但是结果和标准是一样的。但是linux的系统调用,调用是linux的系统库,比如说unistd.h下的fork这个是Linux下特有,你在vs上,就没有这个库,也没有这个函数。同样在vs上写c,你可以引入头文件比如windows.h,显然这个库是Linux不具有的。简单说系统调用库根据具体的操作系统环境不同而不同,而c标准库,是所有支持c语言编译器都有的。
如何使用linux commands step by step
教科书里的Linux代码例子都已作古,所以看到的代码不能当真,领会意思就行了
比如以前的init进程的启动代码
execve(init_filename,argv_init,envp_init);
现在改为
static void run_init_process(char *init_filename)
{
argv_init[0] = init_filename;
kernel_execve(init_filename, argv_init, envp_init);
}
好的,聪明人就发现,linux内核中调用用户空间的程序可以使用init这样的方式,调用 kernel_execve
不过内核还是提供了更好的辅助接口call_usermodehelper,自然最后也是调用kernel_execve
调用特定的内核函数(系统调用)是 GNU/Linux 中软件开发的原本就有的组成部分。但如果方向反过来呢,内核空间调用用户空间?确实有一些有这种特性的应用程序需要每天使用。例如,当内核找到一个设备,这时需要加载某个模块,进程如何处理?动态模块加载在内核通过 usermode-helper 进程进行。
让我们从探索 usermode-helper 应用程序编程接口(API)以及在内核中使用的例子开始。 然后,使用 API 构造一个示例应用程序,以便更好地理解其工作原理与局限。
usermode-helper API
usermode-helper API 是个很简单的 API,其选项为用户熟知。例如,要创建一个用户空间进程,通常只要设置名称为 executable,选项都为 executable,以及一组环境变量(指向 execve 主页)。创建内核进程也是一样。但由于创建内核空间进程,还需要设置一些额外选项。