Articles of 进程

奇怪的内存行为与std map和shared_ptr

下面的代码在我的Debian机器上引发了一个奇怪的内存行为。 即使在清除地图后,htop仍然显示程序仍然使用大量的内存,这让我觉得有内存泄漏。 奇怪的事实是,它只在某些情况下出现。 #include <map> #include <iostream> #include <memory> int main(int argc, char** argv) { if (argc != 2) { std::cout << "Usage: " << argv[0] << " <1|0> " << std::endl; std::cout << "1 to insert in the second map and see the problem " "and 0 to not insert" << std::endl; return 0; […]

在shmdt()和shmctl(shmid,ipc_RMID,0)之前的进程中访问共享内存

假设我有一个指针*p到先前分配的共享内存。 如果其中一个进程调用shmdt()来分离共享内存段,然后尝试分配一个值,例如: *p = 0; 在调用shmctl(shmid, IPC_RMID, 0)进行销毁。 这样做会导致错误? 我无法理解哪些和为什么。

Java过程构build器和使用环境variables

我想要做的是我想运行一个进程,但是因为这个进程本身依赖于环境variables,直接调用它会导致进程内的错误。 对于那些想知道这是什么,这是rake工具。 出于这个原因,我想也许最好是使用bash并通过bash使用它可以消除这个问题。 但是,似乎并非如此。 这是我的代码: public static void runPB(String directory) throws IOException { ProcessBuilder processBuilder = new ProcessBuilder( "/bin/bash"); processBuilder.directory(new File(directory)); Process process = processBuilder.start(); OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream()); osw.write("rake routes"); osw.close(); printStream(process.getErrorStream()); printStream(process.getInputStream()); } public static void printStream(InputStream is) throws IOException { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String […]

检查Python脚本是否已经在运行

我想我的Python脚本检查,如果它已经运行,如果是的话,杀死旧的进程。 我试过这个,但是并没有真正的工作。 import os import subprocess import signal process_name = "python " + os.path.abspath(__file__) proc = subprocess.Popen(["pgrep", process_name], stdout=subprocess.PIPE) # Kill process. for pid in proc.stdout: os.kill(int(pid), signal.SIGTERM) # Check if the process that we killed is alive. try: os.kill(int(pid), 0) raise Exception("""wasn't able to kill the process HINT:use signal.SIGKILL or signal.SIGABORT""") except OSError as […]

通过sudo来识别当前用户的最可靠的方法

我有一个应用程序,可能会或可能不会运行,而用户被sudo'ed共享用户帐户。 我想可靠地确定谁是真正的用户是一种“荣誉系统”ACL。 我认为通过追踪父/组/会话进程ID, pstree命令的方式有一些方法,但我不知道如何做到最好,或者如果有更好的select。 我最初尝试getlogin() 。 如果使用./myapp ,那么这将起作用,但是它会失败,并input'cat input | 。/ myapp“(因为”控制terminal“是共享帐户拥有的pipe道)。 我宁愿不相信环境variables,因为我不希望我的“荣誉系统”被一个简单的未unset完全挫败,当信息在其他地方仍然可用时。 我也想避免强制在密码数据库中查找,因为这是一个远程RPC(NIS或LDAP),我非常确定wtmp已经包含我需要的信息。

使用system()执行后台进程

我尝试使用类似下面的方法来执行一个进程: 系统(“zsh&”); 我不认为它的工作,因为这个过程没有出现。 为什么不起作用? 应该如何改变?

在C ++中的Linux进程加载器

我正在使用C ++的Linux平台的进程加载器; 这只是一个娱乐项目。 基本上,我想手动将可执行文件的所有部分加载到内存中,然后执行它。 我在一周前问了一个相关但更具体的问题。 但是,在做了更多的阅读之后,我意识到在我学会如何实际创build这个过程之前,内存映射将是无关紧要的。 所以我的问题是,有没有办法在Linux上创build一个具有自己的虚拟地址空间的“空白”新进程(我将能够访问以加载代码和数据)? 即使是一般资源上的进程加载器开发将是有益的,因为我还没有find任何。

如何在Java和Solaris上获得所有正在运行的进程的列表?

有没有人知道如何获得在Linux和Solaris上与Java的所有正在运行的进程的列表? 我不想使用外部程序,如ps,我不想使用proc。 我想用本地电话来完成。 我find了使用JNA的Windows的一种方法。 但是这种方式在Linux和Solaris上不起作用。

fork()和execlp(),execlp()之前的printf没有得到执行

我正在学习进程间通信…这是错误的代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { int pfds[2]; pipe(pfds); if (!fork()) { printf("I m the child process\n"); close(1); /* close normal stdout */ dup(pfds[1]); /* make stdout same as pfds[1] */ close(pfds[0]); /* we don't need this */ execlp("ls", "ls", NULL); } else { printf("I m the parent process\n"); close(0); /* […]

fork产生的唯一开销是页表重复和进程id创build

fork()产生的唯一开销是父页表的重复和为子创build一个唯一的进程描述符。 在Linux中,fork()是通过使用写时复制页面来实现的。 写入时复制(或COW)是延迟或完全防止数据复制的技术。 那么为什么还需要复制页表。 只要进程以只读模式共享页面,或者直到他们写入内容为止,那么不需要复制页面表,因为父项和子项的翻译都是相同的。 有人可以解释.. 提前致谢