Articles of 进程

将Linux x86-64程序集hello world程序与ld链接失败

我一直在最近在linux上玩x86 64位程序集,然后在编译一个看起来很简单的程序后,我留下了我的脑袋:P 虽然我编译和链接它没有引发错误,并产生一个Linux ELF当我尝试运行它,我得到: .:[ h4unt3r@sp3ctr4l-h0st asm ]:. #(0)> ./hello bash: ./hello: No such file or directory 我假设它产生一个无效的ELF文件,这就是为什么它报告你不在那里,即使它是。 不知道为什么 – 我可能会继续玩它,只是好奇,如果这可以轻松解决^ _ ^ 这是我的编译/链接命令行: nasm -f elf64 hello.s -g ld -o hello hello.o -lc 这里是代码: section .data msg: db "Hello, world!",0xa,0 section .text extern printf global main main: push rbp mov rbp, rsp mov rdi, […]

gfortran:在64位系统中编译32位可执行文件

我在AMD Athlon(TM)64 X2双核处理器5200+×2上运行Ubuntu 12.10(64位)和Linux内核3.5.0-51-generic。 我有GNU Fortran(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2。 我试图编译成32位可执行文件的代码。 我已经检查过所有需要的库安装在我的系统上(我在之前在32位计算机上编译的程序上运行了ldd,并下载了缺失的程序包)。 我尝试运行$ gfortran foo.f -m32 -L / lib / i386-linux-gnu,但是我得到以下错误: /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgfortran.so when searching for -lgfortran /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgfortran.a when searching for -lgfortran /usr/bin/ld: […]

Linux进程内存消耗(以字节为单位)

在Linux中,有任何方法可以检查以字节为单位测量的进程内存(例如,使用top或ps)。 不是千字节,而是字节。 提前致谢!

如何指定一个CPU内核在Linux中运行一个程序

我需要在CPU的同一核心上运行两个程序。 第二个程序总是运行在另一个内核上,因为第一个程序使用了第一个内核的50%。 我如何强迫Linux在核心上运行程序?

为什么* .pyc文件在关联的* .py文件被删除时被删除

最后看更新。 我正在使用Ubuntu Linux 11.10,Python 3。 我写了一个Python脚本,使用pyuic4将一些Qt * .ui文件转换为* .py。 然后我想编译得到的* .py文件到* .pyc并删除* .py文件。 由于某些原因,当我删除转换的* .py文件时,* .pyc版本也被删除: try: command = 'pyuic4 -o /home/vic/ui_form.py /home/vic/form.ui' output = subprocess.check_output(command, shell= True, stderr= subprocess.STDOUT) except subprocess.CalledProcessError as e: print('Failed:', e.output) else: print('Converted %s to %s' % (source, targetName)) # convert *.py to *.pyc and delete the source source = […]

父进程以Control + C结束时终止进程

我有一个程序有两个进程。 其中一人可能因为例外而终止或退出。 当我testing程序时,我使用Control + c完成它,但subprocess仍在运行。 当我按下control + c或父进程终止时,是否有任何选项可以终止进程。

通过命令行恢复已停止的进程

我在Linux CentOS中执行了下面的C代码来创build一个进程。 #include <stdio.h> #include <unistd.h> int main () { int i = 0; while ( 1 ) { printf ( "\nhello %d\n", i ++ ); sleep ( 2 ); } } 我已经编译成hello_count 。 当我做./hello_count ,输出是这样的: hello 0 hello 1 hello 2 … 直到我杀了它。 我已经停止执行使用以下命令 kill -s SIGSTOP 2956 当我做 ps -e 进程2956 ./hello_count仍在列表中。 是否有任何命令或任何方法来恢复(不重新启动)进程号为2956的进程? […]

将ELF共享库和自定义binfmt可执行文件加载到相同的Linux地址空间中

我正在开发一个项目,在Linux平台上加载和运行一个自定义的二进制格式可执行文件(在我的情况下是PE)。 到目前为止,我已经成功完成了这个工作,首先加载可执行文件,然后加载一个小的ELF共享库,调用可执行文件的开始地址,然后安全地退出。 尽pipe如此,我真的不想自己做ELF加载。 首先,我使用的共享库是用汇编语言编写的(我不能使用任何其他的东西,因为我没有链接到libc等),这将是非常特定于平台的,我想远离并使用C,所以我可以编译任何平台。 而且,使用Linux的本地ELF加载器,而不是我自己的简化版本,会更容易和更安全。 我想知道是否有办法使用我的binfmt处理程序(一个已安装的内核模块)加载我的可执行文件, 然后让Linux将我的共享库(及其依赖项)加载到相同的地址空间中,而不会覆盖我的可执行代码。 我首先想到uselib系统调用可能是有用的,但手册页上的描述不清楚这是否符合我的目的: 从libc 4.4.4只加载库“/lib/ld.so”被加载,以便这个dynamic库可以加载剩余的库(再次使用这个调用)。 这也是libc5中的事态。 glibc2不使用这个调用。 我也从来没有见过它的使用的例子,我总是警惕使用我不明白的系统调用。 有没有一个很好的方法来实现我所描述的? 我可以使用Linux的现有function将共享库(用C语言编写)加载到已经包含可执行代码的地址空间中,如果可以的话,如何在不知道加载的地方使用该库?

按名称获取进程ID

我想在Linux下得到一个名为process name的进程ID。 有一个简单的方法来做到这一点? 我还没有发现任何可以轻松使用的C ++!

Linux内核 – 等待队列

我正在阅读Robert Love的“Linux内核开发第三版”,以获得有关Linux内核工作原理的一般概念..(2.6.2.3) 我很困惑如何等待队列工作,例如这个代码: /* 'q' is the wait queue we wish to sleep on */ DEFINE_WAIT(wait); add_wait_queue(q, &wait); while (!condition) { /* condition is the event that we are waiting for */ prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE); if (signal_pending(current)) /* handle signal */ schedule(); } finish_wait(&q, &wait); 我想知道哪个进程正在运行这个代码? 它是一个内核线程? 谁的处理时间是这样的? 而且在循环中,当条件还没有满足时,我们将继续睡觉,并调用计划来运行另一个进程,问题是什么时候我们返回到这个循环? 这本书说,当一个进程hibernate,它被从我们的运行队列中删除,否则它会被唤醒,不得不进入繁忙的循环… 还说:“睡眠应该始终在一个循环中处理,以确保任务正在等待的条件确实已经发生。” 我只想知道这个循环在什么情况下运行? 对不起,如果这是一个愚蠢的问题。 我只是无法看到大图片