解答系统调用是 *** 作系统提供给软件开发人员的惟一接口,开发人员可利用它使用系统功能。os核心中都有一组实现系统功能的过程(子程序),系统调用是对上述过程的调用。因此,系统调用直观上像一个黑箱子,对用户屏蔽 *** 作系统的具体动作而只提供有关的功能。
为了实现系统调用,系统设计人员还必须为实现各种系统调用功能的子程序编造入口地址表,每个入口地址都与相应的系统子程序名对应起来。然后,由陷阱处理程序把陷阱指令中所包含的功能号与该入口地址表中的有关项对应起来,从而有系统调用功能号驱动有关系统子程序执行。
由于在系统调用处理结束后,用户程序还需利用系统调用的返回结果继续执行,因此,在进入系统调用处理之前,陷阱处理机构还需保存处理机现场。再者,在系统调用处理结束之后,陷阱处理机构还要恢复处理机现场。在 *** 作系统中,处理机的现场一般被保护在特定的内存区或寄存器中。系统调用的处理过程如图1-6所示。
*** 作系统中的状态分为管态和目态。特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令。不同的 *** 作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指令。访管指令:本身是一条特殊的指令,但不是特权指令。基本功能:"自愿进管",能引起访管异常。
用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统调用。
题主是否想问“如何知道你编写的程序hello到底调用哪些系统调用”?方法如下:
1、打开终端,输入如下命令strace-ooutputtxt/hello。
2、运行命令后,程序hello会被执行,strace会将所有系统调用的信息输出到outputtxt文件中。
3、打开outputtxt文件,可以看到程序hello所调用的所有系统调用的详细信息。
一.编写一个C语言程序,用open函数在当前目录下创建一个文件testtxt,然后将数字1~100按顺序写入文件, 之后分别读出第50(从文件开始处计算)、第100个字节处的数字, 并输出该数字到标准输出。然后关闭并删除文件。
要求:
在Linux *** 作系统下调试通过后,在试卷上填写你的程序,并写好完整的注释。
写下你对程序中所使用的open,、write、close等文件系统调用的功能的理解。
雷同的程序两者都按零分处理。
首先用shell命令在用户主目录下创建一个文件myfile, 然后用C语言编写一个程序打印出该文件的类型和组权限位, 判断该用户对该文件是否有执行权限。如果没有,请通过chmod函数给它加上执行权限。
要求和问题:
你是如何用shell命令创建一个文件的?什么是用户的主目录?
在Linux *** 作系统下调试通过后,在试卷上填写你的程序,并写好完整的注释。
雷同的程序两者都按零分处理。
void CAdoDlg::OnBnClickedOk()
{
ShellExecute(NULL,"open","C:\\WINDOWS\\system32\\mstscexe",NULL,NULL,SW_SHOW);
Sleep(500);
CWnd pMainWnd = FindWindow(NULL,"远程桌面连接");
HWND hMainWnd = pMainWnd->m_hWnd;
HWND hOptionWnd = ::FindWindowEx(hMainWnd,NULL,"Button","选项(&O) >>");
::SendMessage(hOptionWnd,BM_CLICK,0,0);
HWND hDlgWnd = ::FindWindowEx(hMainWnd,NULL,"#32770","");
if ( hDlgWnd == NULL )
{
MessageBox("未找到远程桌面连接上的dialog!");
return;
}
HWND hComputerIPWnd = ::FindWindowEx(hDlgWnd,NULL,"ComboBoxEx32",NULL);
if ( hComputerIPWnd == NULL )
{
MessageBox("未找到填写远程计算机IP地址的窗口!");
return;
}
HWND hComputerUserNameWnd = ::FindWindowEx(hDlgWnd,NULL,"Edit",NULL);
if ( hComputerUserNameWnd == NULL)
{
MessageBox("未找到填写远程计算机用户名的窗口!");
return;
}
HWND hComputerUserPwdWnd = ::FindWindowEx(hDlgWnd,hComputerUserNameWnd,"Edit",NULL);
if ( hComputerUserPwdWnd == NULL )
{
MessageBox("未找到填写远程计算机用户密码的窗口!");
return;
}
int nLen=m_servipGetLength();
char servip=new char[nLen];
strcpy(servip,m_servip);
char pt=servip;
int longth=1;
while(pt++!=' ')
{
longth++;
continue;
}
pt--;
for(int i=longth;i<=nLen;i++)
{
strcpy(pt,'\0');
pt++;
}
/nLen=m_servuserGetLength();
char servuser=new char[nLen];
strcpy(servuser,m_servuser);
nLen=m_servpwdGetLength();
char servpwd=new char[nLen];
strcpy(servpwd,m_servpwd);/
::SendMessage(hComputerIPWnd,WM_SETTEXT,0,(LPARAM)servip);
//::SendMessage(hComputerUserNameWnd,WM_SETTEXT,0,(LPARAM)servuser);
//::SendMessage(hComputerUserPwdWnd,WM_SETTEXT,0,(LPARAM)servpwd);
}
在系统中真正被所有进程都使用的内核通信方式是系统调用。例如当进程请求内核服务时,就使用的是系统调用。一般情况下,进程是不能够存取系统内核的。它不能存取内核使用的内存段,也不能调用内核函数,CPU的硬件结构保证了这一点。
以上就是关于 *** 作系统中,什么是系统调用简述其实现过程。全部的内容,包括: *** 作系统中,什么是系统调用简述其实现过程。、简述系统调用的执行过程、如果你想知道你编写的程序hello到底调用哪些系统调用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)