在下面的程序(不是我的程序,但是我修改过的程序)中,子进程对管道进行了两次写入.当我运行该程序时,我得到以下输出:
Received string: Hello, world!
This is the child process.
Run Code Online (Sandbox Code Playgroud)
如何由父进程执行的读取从管道缓冲区中捕获这两个字符串?什么(如果有的话)阻止父进程在读取第一个字符串(或第一个字符串的第一个字符串)之后假设没有其他内容可以从缓冲区中读取并退出?
有问题的计划:
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char string2[] = "This is the child process.\n";
char readbuffer[80];
pipe(fd);
if((childpid = fork()) == -1)
{
perror("fork");
return 1;
}
if(childpid == 0)
{
/* Child process closes pipe's input file descriptor */
close(fd[0]);
/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)));
write(fd[1], string2, (strlen(string2)+1));
return 1; …Run Code Online (Sandbox Code Playgroud) 我不明白这种情况的区别:
#include <stdio.h>
int main()
{
int i = 0;
i = 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这种情况:
#include <stdio.h>
int main()
{
char *mychar = "H";
*mychar = "E";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生编译器警告"赋值使指针在没有强制转换的情况下生成整数".
不应该*mychar = "E"取消引用mychar为其赋值"E"?
非常感谢.
我一直在浏览网站,但尚未找到答案.
用一个例子来解释这个问题是最容易的(至少对我来说).
我不明白为什么这是有效的:
#include <stdio.h>
int main(int argc, char* argv[])
{
char *mystr = "hello";
}
Run Code Online (Sandbox Code Playgroud)
但是这会产生一个编译器警告("初始化使整数从没有强制转换的整数中生成"):
#include <stdio.h>
int main(int argc, char* argv[])
{
int *myint = 5;
}
Run Code Online (Sandbox Code Playgroud)
我对第一个程序的理解是创建一个名为mystr的变量,类型为pointer-to-char,其值是字符串文字"hello"的第一个字符('h')的地址.换句话说,使用此初始化,您不仅可以获取指针,还可以定义指针指向的对象(在本例中为"hello").
那么,为什么int *myint = 5;看起来似乎没有实现与此类似的东西,即创建一个名为myint的变量类型指针指向int,其值是值'5'的地址?为什么这个初始化既不给我指针也定义指针所指向的对象?
我是Java/OOP的新手,我有兴趣了解这个问题的标准方法.
假设我的Java程序包含以下主要方法:
public static void main(String[] args) {
String name = args[1];
Person person = PersonHelper.getPerson(name);
}
Run Code Online (Sandbox Code Playgroud)
想象一下,调用getPerson方法(在PersonHelper.java中定义的其他方法和类的帮助下)执行以下操作:
现在有(至少)三个异常可以在此例程中抛出:
假设调用getPerson(在这种情况下为main)的方法需要能够区分这三个异常,应该如何做?我没有看到异常本身是如何返回的,因为赋值Person person = PersonHelper.getPerson(name)是期望一个Person对象.
在C/x86中,当从函数返回时,我们通常:
pop ebp 恢复上一个函数的帧指针ret其中(据我所知)包含一个隐式,pop eip以便调用函数可以继续从返回地址执行在这一点上,我可以期待esp包含什么?它是指向返回地址正上方的指针,还是esp的值也被隐含地改变了ret?
谢谢 :)