这是我在一个网站上发现的一个面试问题,问题是:"在虚拟内存中,两个不同的进程可以有相同的地址吗?当你回答"否"这是正确的时,一个进程如何访问另一个进程的内存,例如,调试器可以访问变量并在调试时更改它们吗?"
我的理解是:
2 diff进程可以具有相同的虚拟内存地址.这是因为每个进程都有自己的页表.每个进程都认为它是32位机器上的4Gb内存.因此P1和P2都可以访问地址0xabcdef - 但物理内存位置可能不同.这不对吗?
调试器的工作原理相同 - 2个进程可以访问同一个地址.所以它可以动态修改变量等.
我已经理解:1)waitpid用于等待孩子的死亡,然后收集SIGCHLD和孩子的退出状态等.2)当我们有一个SIGCHLD的信号处理程序时,我们做了一些与清理相关的事情.孩子或其他东西(由程序员决定)然后做一个waitpid,这样孩子就不会去僵尸然后回来.
现在,当我们执行fork/exec并且子进程返回时,我们是否需要在程序中同时使用1和2?如果我们两者都有,则首先获取SIGCHLD,因此首先调用信号处理程序,因此成功调用其waitpid而不是父进程代码中的waitpid,如下所示:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main ()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
Run Code Online (Sandbox Code Playgroud)
感谢有人帮助我理解这一点.
我正在使用C并编写客户端 - 服务器程序,我想获得一个未使用的端口号来运行我的服务器进程.我的服务器代码是这样的:
getaddrinfo()
socket()
bind()
listen
while(1)
accept()
Run Code Online (Sandbox Code Playgroud)
我需要为bind()调用提供未使用的端口addr.但是我不希望在启动服务器进程时通过命令行传递端口号.端口号应该通过套接字调用获得,我需要使用它来启动我的客户端进程.是否有任何套接字调用可以帮助我在C中动态获取未使用的端口?
我正在使用 docker-py 并尝试获取 docker stats。但是我无法获得任何 API 来返回特定容器的统计信息。是否有 REST API 或任何其他方式以编程方式获取统计信息?
>>> cli = docker.Client(base_url="tcp://xxxxx:2375", version='1.21')
>>> cli.containers() >> gives the right o/p
>>> cli.containers.get()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'get'
>>> docker.version
'1.10.6'
Run Code Online (Sandbox Code Playgroud) 我想定义一个这样的路径:
#define PATH /abc/xyz/lmn
Run Code Online (Sandbox Code Playgroud)
该PATH是具有文件foo1,foo2,foo3,... foo115的目录.
如何在"打开"调用中使用此#define打开foo1,foo2,... foo115?
我想基本上使用指令执行此操作:
fd = open("/abc/xyz/lmn/foo1", O_RDONLY);
Run Code Online (Sandbox Code Playgroud) 我对char数组有一个简单的疑问.我有一个结构:
struct abc {
char *charptr;
int a;
}
void func1()
{
func2("hello");
}
void func (char *name)
{
strcpy(abc.charptr, name); >>> This is wrong.
}
Run Code Online (Sandbox Code Playgroud)
这个strcpy会导致崩溃,因为我没有为charptr分配任何内存.问题是:为了记录这个记忆,我们可以做
abc.charptr = (char *) malloc(strlen(name)); ?
strcpy(abc,charptr, name); >>> Is this (or strncpy) right ?
Run Code Online (Sandbox Code Playgroud)
这是正确的吗 ?
我试图在1个句子中找到包含"地狱"的所有单词.下面的字符串中有3次出现.但是re.search只返回前两次出现.我试过findall和搜索.有人可以告诉我这里有什么问题吗?
>>> s = 'heller pond hell hellyi'
>>> m = re.findall('(hell)\S*', s)
>>> m.group(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
>>> m = re.search('(hell)\S*', s)
>>> m.group(0)
'heller'
>>> m.group(1)
'hell'
>>> m.group(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
>>>
Run Code Online (Sandbox Code Playgroud) 我正在编写一个服务器客户端程序,在服务器中我使用 getaddrinfo 和 getsockname 在服务器上获取有关本地 IP 地址和本地绑定端口号的信息。使用此信息,我启动客户端程序并使用 getaddrinfo,然后打印出 servinfo 数据结构中的返回值: getaddrinfo(argc[1], argc[2], &hints, &servinfo); >> 服务器主机名和服务器端口号通过命令行传递。
但我注意到 servinfo 中的 sin_port 不是我通过命令行传递的端口。1) 这个 getaddrinfo 是否返回客户端正在使用的端口号作为源端口号?2) getaddrinfo 和套接字调用失败后我的连接调用。我不知道为什么。我该如何调试它?
我的客户端代码片段:
memset(&hints, 0 ,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME | AI_NUMERICSERV;
getaddrinfo(argc[1], argc[2], &hints, &servinfo);
for (p = servinfo till p!=NULL)
sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)
connect(sockfd, p->ai_addr, p->ai_addrlen) >>>>> Connect not going through.
Run Code Online (Sandbox Code Playgroud)
我像这样启动我的客户端程序:./a.out myservername 18844
谢谢 !
我使用管道,fork,dup2来实现"ls | 更多"或"ls | 排序"等我在这里无法理解这个问题.当我运行我的程序时,我收到此错误:
./a.out
Missing filename ("less --help" for help)
Run Code Online (Sandbox Code Playgroud)
为什么我会"少"?
这段代码有什么问题?如果我再次将"更多"更改为"ls",则可以正常工作.我的意思是,它就像做ls | LS.
#define STDIN 0
#define STDOUT 1
int main()
{
int fd[2];
int pid;
char *lschar[20]={"ls",NULL};
char *morechar[20]={"more",NULL};
pid = fork();
if (pid == 0) {
/* child */
int cpid;
cpid = fork();
if(cpid == 0) {
//printf("\n in ls \n");
pipe(fd);
dup2(fd[1], STDOUT);
close(fd[0]);
close (fd[1]);
execvp("ls",lschar);
} else if(cpid>0) {
waitpid(cpid, NULL,0);
dup2(fd[0],STDIN);
close(fd[0]);
close(fd[1]);
execvp("more", morechar);
}
} else if (pid …
Run Code Online (Sandbox Code Playgroud) 我有一个基本的指针问题.我有一些这样的代码:如果以下代码中有任何错误,请告诉我:
struct abc {
int a;
int b;
};
void func2(int*); // defined elsewhere
void func1 (struct abc *p1)
{
struct abc var1 = *p1; // ======> Can I do this ?
func2(&var1.b);
func2(&p1->b); // =========> Which of these 2 is right ?
}
Run Code Online (Sandbox Code Playgroud) 我尝试所有组合时会有点疯狂.我需要一个字符串变量,其值设置为:r'"非常长的字符串\ r"' 这个长字符串是跨多行给出的.我的代码看起来像这样:
str = r'" a very
long
string \r"'
Run Code Online (Sandbox Code Playgroud)
这是在str变量中引入"\n".我尝试使用这个语法"""......""".但是我收到了语法错误.有谁可以帮助我吗 ?我在stackoverflow上看到了其他的Q,它们似乎不符合这个要求.