go的并发
- 同步时遇到竟态
有两种解决:
- 原子操作(sync/atomic)
- 临界区(互斥)
go中的管道使用
os/exec
使用示例1
2
3
4
5cmd0 := exec.Command("echo", "-n", "My first")
cmd0.Start()
stdout0, err := cmd0.StdoutPipe()
output0 := make([]byte, 30)
n, err := stdout0.Read(output0)两个进程间管道的使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cmd1 := exec.Command("ps", "aux")
cmd2 := exec.Command("grep", "apipe")
var outputBuf1 bytes.Buffer
cmd1.Stdout = &outputBuf1
if err := cmd1.Start(); err != nil {
fmt.Printf("Error: The first command can not be startup %s\n", err)
return
}
if err := cmd1.Wait(); err != nil {
fmt.Printf("Error: Couldn't wait for the first command: %s\n", err)
return
}
cmd2.Stdin = &outputBuf1
var outputBuf2 bytes.Buffer
cmd2.Stdout = &outputBuf2
if err := cmd2.Start(); err != nil {
fmt.Printf("Error: The second command can not be startup: %s\n", err)
return
}
if err := cmd2.Wait(); err != nil {
fmt.Printf("Error: Couldn't wait for the second command: %s\n", err)
return
}
fmt.Printf("%s\n", outputBuf2.Bytes())
此管道为匿名管道
- 命令管道创建
1
reader, writer, err := os.Pipe()
注意:匿名管道会在管道缓冲区被写满之后使写数据的进程阻塞,命名管道会在其中一段未被就绪钱阻塞另一端的进程
- 基于内存的有原子操作保证的管道
1
reader, writer := io.Pipe()
信号
是IPC中唯一一种异步通信方式
信号的来源1
2
3
41. 键盘输入
2. 硬件故障
3. 系统函数调用
4. 软件中的非法运算
信号所在代码库os/signal
发送信号函数
1
func Notify()
两个信号是不能被忽略的
信号可以被忽略,捕捉和执行默认操作,有两个信号不能被忽略:SIGKILL和SIGSTOP恢复信号的默认操作
1
func Stop()
go中操作进程
1
2
31. os.StartProcess()启动进程,返回进程值
2. os.FindProcess()查找进程, 返回进程值
3. 调用进程值的signal方法可以给进程发送信号
socket
包net
服务端
1
2net.Listen()
lintener.Accept()客户端
1
2func Dial()
func DialTime()同时设置超时时间操作系统的socket操作不是阻塞的
- socket关闭之后,read会返回io.EOF错误
- net.Conn方法
1
2
3
4
5
6
7
8Read
Write
Close
LocalAddr
RemoteAddr
SetDeadline(超时时间,包括读写,还有其他),超时时间需要每次循环都要设置,使用time.Time{}零值参数取消超时时间
SetReadDeadline(读超时时间)
SetWriteDeadline(写超时时间)
注:客户端也是有端口,毕竟是端到端的通信,不过客户端的端口是内核自己分配的
- 闲置连接
超时说明这个连接已经是闲置连接