可按Ctrl+D收藏 蚂蚁资源网

蚂蚁资源网

linux系统调用(简述系统调用的过程)

  • 时间:2021-12-26 21:07 编辑:郭涛 来源:蚂蚁资源 阅读:134
  • 扫一扫,手机访问
摘要:大家好,今天给大家介绍关于linux系统调用(简述系统调用的过程)的相关内容,详细讲解Linux下的c编程:系统调用,Linux的库函数是如何调用内核函数的,linux操作系统 什么是系统调用?什么是库函数?二者有何区别?等,希望可以帮助到您。
Linux下的c编程:系统调用,Linux C系统功能简介:系统(执行shell命令)相关函数fork,执行,waitpid,popen head文件#i nclude定义函数int系统(const char * string);函数描述系统()将通过子进程调用fork()生成进程,通过子进程来调用/ bin / sh-c字符串来执行参数字符串字符串表示的命令,这一生>执行遵循返回原始呼叫的过程。在呼叫系统()期间,将忽略SIGINT和SIGQUIT信号。返回值\u003d -1:错误\u003d 0:呼叫成功但没有子进程>0:如果系统()在调用/ bin / sh时返回127,则成功退出的子进程的ID,返回127,其他故障原因返回 - 1.如果参数字符串是空指针,则返回非零值&gt(空值)。如果系统()呼叫成功,最终返回执行shell命令后返回返回值,但此返回val也可以返回UE for System()调用/ bin / sh失败,因此最好检查errno以确认执行成功。。附加说明请勿在使用Suid / SgID权限编写程序时使用System(),系统()将继承环境变量,这可能会通过环境变量导致系统安全问题。sample #i ncleudemain(){system(“ls -al / etc / passwd / etc / shadow”);}执行:-rw-r - r - 1根root 705 sep 3 13:52 / etc /passwd-r --------- 1根目录572 9月2日15:34 / etc / shado示例2:char tmp [];Sprintf(TMP,“/ bin / mount -t vfat%s / mnt / usb”dev;系统(tmp); dev是/ dev / sda1。源系统函数#include< syspes.h> #include< sys / wait.h> #include> #include< unistd.h> int系统(const char * cmdstring){pid_t pid; int状态;如果(cmdstring \u003d\u003d null){return(1);}if(pid \u003d fork())<0){status \u003d -1;}如果(pid \u003d 0){execl(“/ bin / sh”,则“sh”,“ - 退出(127); //子程序没有执行此语句} else {whis(waitpid(waitpid),0)< 0){if(errno!\u003d Einter){status \u003d -1; break; break;}}} resporcock;}所以如何获得返回值system ?? char buf [10]; char * ps \u003d“ps-ef | grep-c根”;文件* ptr; int i; if((ptr \u003d popen(ps,&&qout;))!\u003d null){fgets(buf,10,ptr); i \u003d atoi(buf); pclose(ptr);}你可以检查如何检查watepid中的状态,int ret \u003d system(“ls-al / etc / passwd / etc / shib"如果(Wifsignaled(RET))特定这些宏观视图男人waitpid
Linux的库函数是如何调用内核函数的,看系统调用,还有一个库函数,我从来没有理解过,始终认为系统调用库函数,但今天我知道它是不同的。库函数是应用程序编程接口API我们通常会说,它实际上是一个函数定义,如常见的read(),write()和其他函数描述如何获得给定的服务,但系统调用是通过软中断内核问题清晰的请求,系统调用在内核中完成,用户的函数在函数库中完成。系统调用发生在内核空间中,因此如果在用户空间的一般应用中使用系统调用,则使用用户空间用于将用户空间切换到内核空间。实际上,即使该文件用于使用库函数运行,因为文件始终存在于存储介质上,无论是读写的写作,它都是硬件(内存)操作,它会不可避免地原因系统调用。也就是说,库函数实际上由系统调用操作实现。例如,C库函数fwrite()由Write()系统调用实现。在这种情况下,使用库函数也有系统调用的开销,为什么不直接使用系统调用?这是因为读写文件通常是大量数据(这个大量的数据操作单元相对于底层系统调用而实现),此时,库函数可以大大减少系统呼叫的数量。此结果仍在缓冲技术中。在用户空间和内核空间中,文件操作使用缓冲区,例如用FWRITE编写文件,首先将内容写入用户空间缓冲区,并在用户空间缓冲区已满或写操作完成时缓冲用户。该区域的内容被写入内核缓冲区,同样的原因,当内核缓冲区已满或写入时,内核缓冲区内容是written到与文件对应的文件。系统调用和系统命令:系统命令高于API,每个系统命令是可执行程序,例如常用的系统命令LS,主机名等,如strace ls,会发现它们呼叫如打开(),brk(),fstat(),ioctl()和其他系统调用。系统调用是用户进程进入内核的接口层。它本身不是内核函数,但他是由内核函数实现的。进入系统内核后,不同的系统调用将找到相应的核心函数,称为内核功能。由系统调用的服务程序。还可以说系统调用是服务例程包例程。
linux操作系统 什么是系统调用?什么是库函数?二者有何区别?,所谓的系统调用是内核提供的一系列功能。这些系统调用在内核中实现,然后以某种方式调用对用户的系统,其通常由门(陷阱)实现。系统调用是用户程序和内核交互的接口。整个系统调用的过程可以概括如下:1。执行用户程序(例如:Fork)2。根据Glibc中的功能,获取系统呼叫号码并执行INT $ 0x80生成的中断。3.执行地址空间的切换和堆栈的切换,执行save_all。(拨打模式)4。执行中断处理,并根据系统呼叫表调用内核函数。5.执行内核功能。6.执行restore_all并返回用户模式差分资料库功能和系统呼叫:在长期编程中发现的人有一个主要的缺点,即计划的可移植性,如由Linux系统和Windows调用的系统的功能不同,两者不仅实现了两个,而且提供给用户的功能名称,参数是不同的,这可以理解。因此,使用Linux系统呼叫(如WAIVE4函数)的好程序,然后在Windows上编译。所以人们想到一种方式,它是要封装Windows和Linux系统调用,给你一个统一的函数(我习惯它到界面),然后这个程序的移植问题得到了解决。因此,您可以认为库函数是系统(并非所有库函数)的包,这是解决一些公共问题并提供统一的接口,以及系统呼叫的优点和缺点是:系统调用速度显然是显而易见的比图书馆函数更快(不一定是全部,但大多数),但系统调用缺乏移植性。库函数很慢,但移植问题已解决。这些在发展过程中应该决定根据自己的实际情况使用那个。

责任编辑(郭涛

以上就是关于**linux系统调用,简述系统调用的过程**的全部内容,如有需要以上系统,请在搜索框搜索商品或者咨询客服,了解更多请关注蚂蚁资源网。
内容来源于网络,如无意中有侵权,请联系客服核实,以便及时删除,谢谢支持!
  • 全部评论(3)
  • 无敌
  • Linux C语言用system()调用,带参数,linux c system函数介绍:system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #i nclude定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。返回值 =-1:出现错误 =0:调用成功但是没有出现子进程 >0:成功退出的子进程的id 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。附加说明 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。范例 #i ncludemain(){system("ls -al /etc/passwd /etc/shadow");}执行结果:-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd-r--------- 1 root root 572 Sep 2 15 :34 /etc/shado例2:char tmp[];sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);system(tmp);其中dev是/dev/sda1。 system函数的源码 #include #include #include #include int system(const char * cmdstring) { pid_t pid; int status; if(cmdstring == NULL){ return (1); } if((pid = fork())<0){ status = -1; } else if(pid = 0){ execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); -exit(127); //子进程正常执行则不会执行此语句 } else { while(waitpid(pid, &status, 0) < 0){ if(errno != EINTER) { status = -1; break; } } } return status;}那么如何获得system的返回值呢??char buf[10];char * ps="ps -ef|grep -c root";FILE *ptr;int i;if((ptr = popen(ps, "r")) != NULL){ fgets(buf, 10 , ptr); i = atoi(buf); pclose(ptr);}可以man下waitpid查看下如何检查status的值 int ret = system("ls -al /etc/passwd /etc/shadow"); if(WIFSIGNALED(ret))具体的这些宏查看man waitpid
  • 2021-12-26 21:07:40
  • 萨满祭司
  • 百度百科对系统调用的介绍:操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的函数。
  • 2021-12-26 21:08:58
最新发布的资讯信息
【简历/资料|内地女明星】 殷茹基本资料( YR个人简历介绍)(2020-12-06 15:19)
【简历/资料|内地女明星】 曹菁基本资料( CJ个人简历介绍)(2020-12-06 15:18)
【简历/资料|内地女明星】 王安妮基本资料( WAN个人简历介绍)(2020-12-06 15:18)
【简历/资料|内地女明星】 白琼基本资料( BQ个人简历介绍)(2020-12-06 15:17)
【简历/资料|内地女明星】 王世霞基本资料( WSX个人简历介绍)(2020-12-06 15:17)
【简历/资料|内地女明星】 宋煜基本资料( SY个人简历介绍)(2020-12-06 15:16)
【简历/资料|内地女明星】 钱增基本资料( QZ个人简历介绍)(2020-12-06 15:16)
【简历/资料|内地女明星】 胡晓黎基本资料( HXL个人简历介绍)(2020-12-06 15:15)
【简历/资料|内地女明星】 李佳慧基本资料( LJH个人简历介绍)(2020-12-06 15:15)
【简历/资料|内地女明星】 张洛嘉基本资料( ZLJ个人简历介绍)(2020-12-06 15:14)
联系客服
网站客服 联系客服
手机版

扫一扫进手机版
返回顶部