在"Unix环境中的高级编程",第2版,作者:W.Richard Stevens.
第8.3节fork函数.
这是描述:
父和子共享相同的文件偏移量很重要.
考虑一个分叉孩子的过程,然后等待孩子完成.假设两个进程都写入标准输出作为其正常处理的一部分.如果父级的标准输出重定向(可能是shell),则当子级写入标准输出时,子级必须更新父级的文件偏移量.
[1.这是什么意思?例如,如果父项的std输出被重定向到'file1',那么子项写入后子项应该更新什么?parent的原始std输出偏移量或重定向输出(即file1)偏移量?不能晚了,对吧?
[2.更新是如何完成的?由子显式,由OS隐式地,由文件描述符本身?在fork之后,我认为父母和孩子走自己的路,并拥有自己的文件描述符COPY.那么孩子如何更新偏移到父方?]
在这种情况下,孩子可以在父母等待时写入标准输出; 在孩子完成后,父母可以继续写入标准输出,知道其输出将附加到孩子写的任何内容.如果父级和子级没有共享相同的文件偏移量,则此类交互将更难以完成,并且需要父级的显式操作.
如果父节点和子节点都写入相同的描述符,而没有任何形式的同步,例如让父节点等待子节点,则它们的输出将被混合(假设它是在fork之前打开的描述符).虽然这是可能的,但这不是正常的操作模式.
在fork之后处理描述符有两种正常情况.
父母等待孩子完成.在这种情况下,父级不需要对其描述符执行任何操作.当子进程终止时,子进程读取或写入的任何共享描述符将相应地更新其文件偏移量.
父母和孩子都有自己的方式.这里,在fork之后,父关闭它不需要的描述符,并且子进行相同的操作.这样,既不会干扰对方的开放描述符.网络服务器经常出现这种情况."
[3.当调用fork()时,我理解的是那个子得到了父有什么的COPY,在这种情况下是文件描述符,并做了它的事情.如果任何偏移更改为父和子共享的文件描述符,则只能因为描述符记住偏移本身.我对吗?]
对不起,我对这些概念不太了解.
有帮助吗?谢谢.
我认为传统继承遵循'is-a'模式,而decorator遵循'has-a'模式.装饰者的调用约定看起来像'皮肤'上的'皮肤'......超过'核心'.例如
I* anXYZ = new Z( new Y( new X( new A ) ) );
Run Code Online (Sandbox Code Playgroud)
如上面的代码示例链接所示.
但是仍然有一些我不明白的问题:
wiki是什么意思'装饰模式可以用来在运行时扩展(装饰)某个对象的功能'?'new ...(new ...(new ...))'是一个运行时调用,但很好但是'AwithXYZ anXYZ;' 是编译时的继承而且不好?
从代码示例链接中我可以看到,两个实现中类定义的数量几乎相同.我记得在其他一些设计模式书中,比如"Head first design patterns".他们使用starbuzz咖啡作为例子,并说传统的继承将导致"阶级爆炸",因为对于每种咖啡组合,你会想出一个类.
但在这种情况下装饰者是不是一样的?如果一个装饰器类可以接受任何抽象类并进行装饰,那么我猜它确实可以防止爆炸,但是从代码示例中,你可以得到确切的类定义,不能少......
有人会解释吗?
我听说C中的printf()不应该用于ISR.是因为它是一个阻止呼叫,还是因为它不是可重入的?
如果printf()不是可重入的,那么它不会意味着它也不能用于多线程程序,除非它以某种方式"同步"吗?
谢谢,
我读到了volatile内存映射硬件寄存器,ISR和多线程程序中C 关键字的用法.
1)注册
uint8_t volatile * pReg;
while (*pReg == 0) { // do sth } // pReg point to status register
Run Code Online (Sandbox Code Playgroud)
2)ISR
int volatile flag = 0;
int main()
{
while(!flag) { // do sth }
}
interrupt void rx_isr(void)
{
//change flag
}
Run Code Online (Sandbox Code Playgroud)
3)多线程
int volatile var = 0;
int task1()
{
while (var == 0) { // do sth }
}
int task2()
{
var++;
}
Run Code Online (Sandbox Code Playgroud)
我可以看出为什么编译器可以错误地优化while以防万一1)如果volatile不存在,'因为变量是由硬件进行的,编译器可能看不到代码所做的变量的任何变化. …
我在书籍[linux device drivers]中阅读了这一行脚本.任何人都可以帮助解释它的作用(可能只是几个字)?
major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices)
Run Code Online (Sandbox Code Playgroud)
在上下文中:
#!/bin/sh
module="scull"
device="scull"
mode="664"
# invoke insmod with all arguments we got
# and use a pathname, as newer modutils don't look in . by default
/sbin/insmod ./$module.ko $* || exit 1
# remove stale nodes
rm -f /dev/${device}[0-3]
major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices)
mknod /dev/${device}0 c $major 0
....
Run Code Online (Sandbox Code Playgroud) c ++ faq 35.16
http://www.parashift.com/c++-faq-lite/template-friends.html
#include <iostream>
template<typename T>
class Foo {
public:
Foo(T const& value = T());
friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);
friend std::ostream& operator<< (std::ostream& o, const Foo<T>& x);
private:
T value_;
};
Run Code Online (Sandbox Code Playgroud)
汽车公司声称:
当编译器在类定义中看到朋友行正确时,就会发生这种障碍.那时它还不知道朋友函数本身就是模板(为什么它不是类模板成员函数默认是函数模板?) ; 它假设它们是非模板这样的:'
Foo<int> operator+ (const Foo<int>& lhs, const Foo<int>& rhs)
{ ... }
std::ostream& operator<< (std::ostream& o, const Foo<int>& x)
{ ... }
Run Code Online (Sandbox Code Playgroud)
为什么上面的非模板?是不是通过int实例化的这些模板?
'当你调用operator +或operator <<函数时,这个假设会导致编译器生成对非模板函数的调用,但是链接器会给你一个"未定义的外部"错误,因为你从未真正定义过那些非模板函数."
实际上,为了使编译器将上面的内容识别为函数模板,程序员必须明确地执行此操作,如下所示:
template<typename T> class Foo; // pre-declare the template class itself …Run Code Online (Sandbox Code Playgroud) 我正在编写脚本来选择并在JIRA的下面的屏幕中输入值.
<input type="text" autocomplete="off" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false" class="text aui-ss-field ajs-dirty-warning-exempt" id="issuetype-field" aria-controls="issuetype-suggestions">Run Code Online (Sandbox Code Playgroud)
在输入"输入类型"的值后,其他字段(如"摘要")将灰显几秒钟.如果我尝试输入'summary'字段的值,请使用以下代码:
myDriver.findElement(By.id("summary")).sendKeys(summary);
Run Code Online (Sandbox Code Playgroud)
将不会输入摘要字段,而是会出现错误"在缓存中找不到元素 - 可能页面自查找以来已更改...".
"摘要"字段的HTML代码是:
<input type="text" value="" name="summary" id="summary" class="text long-field">Run Code Online (Sandbox Code Playgroud)
所以我想要的只是等待'summary'输入字段被启用然后sendkey到它.我正在寻找类似的东西
ExpectedConditions.presenceOfElementLocated
Run Code Online (Sandbox Code Playgroud)
但相反,我希望' 启用 ',而不是presenceOfElementLocated或visibilityOfElementLocated.我不想用Thread.sleep().
有什么建议?
我正在用 Cucumber Java 做一个简单的 rest api 测试。响应采用 Json 格式。
我写的小黄瓜特征文件看起来像:
Scenario:
Given I query service by "employees"
When I make the rest call
Then response should contain:
"""
{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
"""
Run Code Online (Sandbox Code Playgroud)
现在,由于有多个查询要使用不同的参数(如“员工”、“部门”等)进行测试,因此很自然地编写 Scenario Outline 来执行任务:
Scenario Outline:
Given I query service by "<category>"
When I make the rest call
Then response should contain "<json_string_for_that_category>"
Examples:
| category | json_string_for_that_category |
| employee | "json_string_expected_for_employee" |
| department | "json_string_expected_for_department"|
Run Code Online (Sandbox Code Playgroud)
其中 json_string_expected_for_employee 只是:
{"employees":[
{"firstName":"John", …Run Code Online (Sandbox Code Playgroud) 我正在使用黄瓜量角器框架来运行功能文件。
在我的 config.js 中,我有:
specs: [
"../../features/XXX1.feature",
"../../features/XXX2.feature",
...
"../../features/XXXn.feature",
],
cucumberOpts: {
tags: "@mytag",
},
Run Code Online (Sandbox Code Playgroud)
在我的功能文件 XXX1.feature 中,我设置了这个标签“@mytag”:
@mytag
Scenario Outline: my Flow
Given I am running test case one
....
Run Code Online (Sandbox Code Playgroud)
但不在任何其他功能文件中,如 XXX2.feature、XXX3.feature 等。
我期望量角器仅运行 XXX1.feature,而不运行 XXX2.feature。确实如此,当谈到 XXX2.feature 时,它会启动浏览器,什么也不做,然后输出以下内容:
[14:35:53] I/testLogger - [chrome #01-2] PID: 14272
[chrome #01-2] Specs: D:\ptfbc\ui\features\XXX2.feature
[chrome #01-2]
[chrome #01-2] [14:35:44] I/hosted - Using the selenium server at http://127.0.0.1:4444/wd/hub
[chrome #01-2]
[chrome #01-2]
[chrome #01-2] 0 scenarios
[chrome #01-2] 0 steps
[chrome #01-2] …Run Code Online (Sandbox Code Playgroud) 我正在使用邮递员来获取如下响应标头值:
var data = postman.getResponseHeader("Location") . //value is "http://aaa/bbb" for example
Run Code Online (Sandbox Code Playgroud)
我可以通过打印值 console.log(data)轻松。
然而,我真正想要的是“bbb”。所以我需要某种substring()类型的功能。显然 'data' 不是 javascript 字符串类型,因为data.substring(10)例如总是返回 null。
在这种情况下,有人需要我做什么吗?
如果有任何邮递员 API 文档可以解释这一点?