运行linux中的程序

2018-12-06 17:17:21 weixin_42608550 阅读数 4683

Linux下优雅的让程序后台运行
  假设在终端上启动运行了一个程序,跑了几天,如果不小心把terminal关了,那么程序就会终止,这是SIGHUP信号的原因,即使通过bg置为后台运行同样会如此,应该让程序成为一个daemon,步骤如下:

法1

1.Ctrl+z 暂停程序的运行,可以看到程序的作业号,假设为1;
2.bg %1 置为后台运行;
3. disown -h %1 使其不受终端关闭的影响。


=> The disown command on ksh shell causes the shell not to send a HUP signal to each given job, or all active jobs if job is omitted, when a login shell terminates.
=>The disown command on bash shell can either remove jobs or causes the shell not to send a HUP signal to each given job or all jobs.

实例:
./main.py 之前是终端上正常运行的普通程序。

按上面操作之后,通过 ps -ef | awk '$3 == 1' 命令可以看到程序变成了daemon.

法二:
nohup 你的命令 > /dev/null 2>&1 &

nohup :表示所属终端关闭后,进程不会死掉;
> /dev/null :标准输出重定向到 /dev/null (a dummy device that does not record any output).
2>&1 :标准出错重定向到标准输出,也到/dev/null
最后的& :后台任务

2013-07-22 23:34:16 woailincon 阅读数 2911

 Linux中程序的运行原理

在Linux的开发环境中,C语言程序的运行环境如图1-3所示。

作为UNIX操作系统的一种,Linux的操作系统提供了一系列的接口,这些接口被称为系统调用(System Call)。在UNIX的理念中,系统调用"提供的是机制,而不是策略"。C语言的库函数通过调用系统调用来实现,库函数对上层提供了C语言库文件的接口。在应用程序层,通过调用C语言库函数和系统调用来实现功能。一般来说,应用程序大多使用C语言库函数实现其功能,较少使用系统调用。

 
图1-3  Linux下C语言程序的结构

在Linux等系统的环境中,C语言库及其头文件都是系统的一部分,只要安装了编译工具即可以完成C语言程序的开发。这点与Windows中程序的开发有所不同,Windows中一般需要安装开发包才能进行程序开发。

C语言程序经过编译-汇编-连接,最终生成可执行程序格式。可执行程序中包含两个部分的内容:

程序头

程序主体(二进制机器代码)

在程序头中包含了供操作系统加载的信息,操作系统根据这些信息加载可执行程序。而可执行程序的主体依然是二进制的机器代码。程序在运行的时候,正是靠逐条地执行这些机器代码,形成程序运行的序列。

在Linux操作系统中,普遍使用ELF格式来作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位Intel体系上不同操作系统之间可移植的二进制文件格式。

如果开发者定义了一个二进制接口集合,ELF标准允许用它来支持流线型的软件运行。通过它可以减少不同执行接口的数量,也可以减少重新编程和重新编译的代码。

ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库。

1.可执行文件(应用程序)

可执行文件包含了代码和数据,是可以直接运行的程序。

2.可重定向文件(*.o)

可重定向文件又称为目标文件,它包含了代码和数据(这些数据是和其他重定位文件和共享的object文件一起连接时使用的)。

3.共享文件(*.so)

也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。动态连接器可能称为ld.so.1,libc.so.1 或者 ld-linux.so.1。

object文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序)。object文件格式提供了一个方便有效的方法来用并行的视角看待文件的内容,这些object文件的活动可以反映出不同的需要。一个ELF头存在于文件的开始处,在这里保存了路线图(road map),描述了该文件的组织情况。节(section)保存着object 文件的信息,从连接角度看它包括指令、数据、符号表和重定位信息等。

ELF文件格式如图1-4所示。

 
(点击查看大图)图1-4  ELF可执行程序结构

一个ELF文件从连接器(Linker)的角度看,是一些节的集合;从程序加载器(Loader)的角度看,它是一些段(Segments)的集合。ELF格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。

ELF格式的共享库可以加载到任何地址。事实上,共享库使用PIC(Place Independence Code,位置无关代码),使得文件的代码段(Text Page)不需要重定位,并且可以被多个进程共享。ELF格式的连接器通过GOT(Global Offset Table)来支持PIC代码。

原文地址:http://book.51cto.com/art/200902/111794.htm

ABI(application binary interface)是什么样东西?

ABI是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行.
比如我在PC上用不管什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一个LINUX机器上运行. 调用系统或别人的LIB.
ABI定义了BINARY的文件格式, 内容, 以及装载/卸载程序的要求, 函数调用时参数传递规则, 寄存器, 堆栈的使用等.

2017-05-19 19:52:41 march_it 阅读数 422

设计一个函数,功能为:删除字符串中所有个空格。

代码:


//设计一个函数,功能为:删除字符串中所有个空格。

#include
<stdio.h>
#include
<string.h>

void fun(char *a)
{
int i=0,j=0;
int len=strlen(a);
for (i=0; i<len; i++)
{
while (a[i] == ' ')
{
for (j=i; j<len; j++)
{
a[j]
= a[j+1];
}
}
}
}

int main()
{
char a[256]="as;ldfj s a s kdl jfl;k sadjf";
puts(a);
fun(a);
puts(a);
return 1;
}

结果:

[hanxi@hanxi-workstation Documents]$ gcc -lm code10.c
[hanxi@hanxi
-workstation Documents]$ ./a.out
as;ldfj s a s kdl jfl;k sadjf
as;ldfjsaskdljfl;ksadjf
2019-05-01 14:58:31 qq_36916968 阅读数 1452

安卓是可以运行linux应用程序的,安卓系统原来就基于Linux。但是安卓已经把linux改头换面了。具体方法是安装Termux软件,然后就可以运行pkg命令安装软件包了,希望可以帮助到大家。

2017-06-30 16:01:16 u013846293 阅读数 118879

1、运行.sh文件

直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令。

(1)&命令

          功能:加在一个命令的最后,可以把这个命令放在后台执行

(2)nohup命令

          功能:不挂断的运行命令

        

2、查看当前后台运行的命令

有两个命令可以用,jobs和ps,区别是jobs用于查看当前终端后台运行的任务,换了终端就看不到了。而ps命令用于查看瞬间进程的动态,可以看到别的终端运行的后台进程。

(1)jobs命令

        功能:查看当前终端后台运行的任务

       

       jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。

(2)ps命令

          功能:查看当前的所有进程

          

         ps -aux | grep "test.sh"    #a:显示所有程序  u:以用户为主的格式来显示   x:显示所有程序,不以终端机来区分


3、关闭当前后台运行的命令

      kill命令:结束进程

     (1)通过jobs命令查看jobnum,然后执行   kill %jobnum

     (2)通过ps命令查看进程号PID,然后执行  kill %PID

       如果是前台进程的话,直接执行 Ctrl+c 就可以终止了


4、前后台进程的切换与控制

     (1)fg命令

       功能:将后台中的命令调至前台继续运行

       如果后台中有多个命令,可以先用jobs查看jobnun,然后用 fg %jobnum 将选中的命令调出。

     (2)Ctrl + z 命令

       功能:将一个正在前台执行的命令放到后台,并且处于暂停状态

     (3)bg命令

       功能:将一个在后台暂停的命令,变成在后台继续执行

       如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。