⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unix

📁 Unix编程常见问题解答
💻
📖 第 1 页 / 共 5 页
字号:
                              How do I compare strings using filename patterns? 
                              我怎样使用文件名通配模式比较字符串?<BR>&nbsp;&nbsp;&nbsp;&nbsp;5.1.2 
                              How do I compare strings using regular 
                              expressions? 我怎样使用正则表达式比较字符串?<BR>&nbsp;&nbsp;5.2 
                              What's the best way to send mail from a program? 
                              什么是在程序中发送电子邮件的最好方法?<BR>&nbsp;&nbsp;&nbsp;&nbsp;5.2.1 
                              The simple method: /bin/mail 
                              简单方法:/bin/mail<BR>&nbsp;&nbsp;&nbsp;&nbsp;5.2.2 
                              Invoking the MTA directly: /usr/lib/sendmail 
                              直接启动邮件传输代理(译者注:MTA: mail transfer 
                              agent):/usr/bin/sendmail<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.2.2.1 
                              Supplying the envelope explicitly 
                              显式提供收件人信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.2.2.2 
                              Allowing sendmail to deduce the recipients 
                              允许sendmail程序根据邮件内容分析出收件人<BR><BR>6. Use of tools 
                              工具的使用<BR>&nbsp;&nbsp;6.1 How can I debug the 
                              children after a fork? 
                              我怎样调试fork函数产生的子进程?<BR>&nbsp;&nbsp;6.2 How to build 
                              library from other libraries? 
                              怎样通过其他库文件建立新的库文件?<BR>&nbsp;&nbsp;6.3 How to create 
                              shared libraries / dlls? 
                              怎样创建动态连接库/dlls?<BR>&nbsp;&nbsp;6.4 Can I replace 
                              objects in a shared library? 
                              我能更改一个动态连接库里的目标吗?<BR>&nbsp;&nbsp;6.5 How can I 
                              generate a stack dump from within a running 
                              program? 我能在一个运行着的程序中生成堆栈映象吗?<BR><BR><BR>1. 
                              进程控制<BR>***********<BR><BR>1.1 
                              创建新进程:fork函数<BR>========================<BR><BR>1.1.1 
                              fork函数干什么?<BR>----------------------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              #include 
                              &lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              #include 
                              &lt;unistd.h&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              pid_t 
                              fork(void);<BR><BR>‘fork()’函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为<BR>父进程。你可以通过检查‘fork()’函数的返回值知道哪个是父进程,哪个是子进程。父<BR>进程得到的返回值是子进程的进程号,而子进程则返回0。以下这个范例程序说明它的基本<BR>功能:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              pid_t pid;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; switch 
                              (pid = fork())<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              {<BR>&nbsp;&nbsp;&nbsp;&nbsp; case 
                              -1:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* 这里pid为-1,fork函数失败 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* 一些可能的原因是 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* 进程数或虚拟内存用尽 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              perror("The fork 
                              failed!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              break;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; case 
                              0:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* pid为0,子进程 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* 这里,我们是孩子,要做什么? 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* ... 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* 但是做完后, 我们需要做类似下面: 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              _exit(0);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              /* pid大于0,为父进程得到的子进程号 
                              */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                              printf("Child's pid is 
                              %d\n",pid);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              }<BR><BR>当然,有人可以用‘if() ... else 
                              ...’语句取代‘switch()’语句,但是上面的形式是<BR>一个有用的惯用方法。<BR><BR>知道子进程自父进程继承什么或未继承什么将有助于我们。下面这个名单会因为<BR>不同Unix的实现而发生变化,所以或许准确性有了水份。请注意子进程得到的是<BR>这些东西的 
                              *拷贝*,不是它们本身。<BR><BR>由子进程自父进程继承到:<BR><BR>&nbsp;&nbsp; 
                              * 进程的资格(真实(real)/有效(effective)/已保存(saved) 
                              用户号(UIDs)和组号(GIDs))<BR><BR>&nbsp;&nbsp; * 
                              环境(environment)<BR><BR>&nbsp;&nbsp; * 
                              堆栈<BR><BR>&nbsp;&nbsp; * 内存<BR><BR>&nbsp;&nbsp; * 
                              打开文件的描述符(注意对应的文件的位置由父子进程共享,这会引起含糊情况)<BR><BR>&nbsp;&nbsp; 
                              * 执行时关闭(close-on-exec) 标志 
                              (译者注:close-on-exec标志可通过fnctl()对文件描<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              述符设置,POSIX.1要求所有目录流都必须在exec函数调用时关闭。更详细说明,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              参见&lt;&lt;UNIX环境高级编程&gt;&gt; W. R. Stevens, 1993, 
                              尤晋元等译(以下简称&lt;&lt;高级编<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              程&gt;&gt;), 3.13节和8.9节)<BR><BR>&nbsp;&nbsp; * 
                              信号(signal)控制设定<BR><BR>&nbsp;&nbsp; * nice值 
                              (译者注:nice值由nice函数设定,该值表示进程的优先级,数值越小,优<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              先级越高)<BR><BR>&nbsp;&nbsp; * 进程调度类别(scheduler 
                              class) 
                              (译者注:进程调度类别指进程在系统中被调度时所<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              属的类别,不同类别有不同优先级,根据进程调度类别和nice值,进程调度程序可计<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              算出每个进程的全局优先级(Global process 
                              prority),优先级高的进程优先执行)<BR><BR>&nbsp;&nbsp; * 
                              进程组号<BR><BR>&nbsp;&nbsp; * 对话期ID(Session ID) 
                              (译者注:译文取自&lt;&lt;高级编程&gt;&gt;,指:进程所属的对话期<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              (session)ID, 一个对话期包括一个或多个进程组, 
                              更详细说明参见&lt;&lt;高级编程&gt;&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              9.5节)<BR><BR>&nbsp;&nbsp; * 
                              当前工作目录<BR><BR>&nbsp;&nbsp; * 根目录 
                              (译者注:根目录不一定是“/”,它可由chroot函数改变)<BR><BR>&nbsp;&nbsp; 
                              * 文件方式创建屏蔽字(file mode creation mask (umask)) 
                              (译者注:译文取自&lt;&lt;高级编<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              程&gt;&gt;,指:创建新文件的缺省屏蔽字)<BR><BR>&nbsp;&nbsp; * 
                              资源限制<BR><BR>&nbsp;&nbsp; * 
                              控制终端<BR><BR>子进程所独有:<BR><BR>&nbsp;&nbsp; * 
                              进程号<BR><BR>&nbsp;&nbsp; * 
                              不同的父进程号(译者注:即子进程的父进程号与父进程的父进程号不同,父进<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              程号可由getppid函数得到)<BR><BR>&nbsp;&nbsp; * 
                              自己的文件描述符和目录流的拷贝(译者注:目录流由opendir函数创建,因其为<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              顺序读取,顾称“目录流”)<BR><BR>&nbsp;&nbsp; * 
                              子进程不继承父进程的进程,正文(text),数据和其它锁定内存(memory 
                              locks)<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              (译者注:锁定内存指被锁定的虚拟内存页,锁定后,不允许内核将其在必要时<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              换出(page out),详细说明参见&lt;&lt;The GNU C Library 
                              Reference Manual&gt;&gt; 
                              2.2版,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 1999, 
                              3.4.2节)<BR><BR>&nbsp;&nbsp; * 
                              在tms结构中的系统时间(译者注:tms结构可由times函数获得,它保存四个数据<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                              用于记录进程使用中央处理器(CPU:Central Processing 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -