linux的&&和;和&,$! $? sleep wait exit

  • &&:多个命令依次运行,某个命令报错后,后面的命令不再执行
  • ;:多个命令依次运行,某个命令报错后,后面的命令继续执行
  • &:在某个命令后加上&,该命令后台执行
    比如pwd&sleep 1会打印当前目录后等待1s。sleep 1&pwd打印当前目录后退出。
    比如exit会关闭shell窗口,exit &不会。

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1…9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$ @ 跟$*类似,但是可以当作数组用

exit 的返回值需要设定在0-255

一些例子

(sleep 6; exit 222)& echo 1&&sleep 2;echo 2;wait $!;echo $?
	输出1,休息2s,输出2,休息4s,输出222
	分析:
		后台执行(sleep 6; exit 222),
		sleep2,echo 2,wait $!等待(sleep 6; exit 222)的结果,echo $?输出其结果
		(wait $!等待后台运行的最后一个进程的进程ID号,即sleep 6; exit 222,因为该命令后面加了&)
sleep 6; exit 222& echo 1&&sleep 2;echo 2;wait $!;echo $?
	休息6s,输出1,休息2s,输出2,输出222
	分析:
		后台执行exit 222,所以不会退出,且echo $?输出该命令的返回值
(sleep 6; exit 222)& echo 1&&sleep 2;echo 2&wait $!;echo $?
	输出1,休息2s,输出2,输出0
	分析:
		后台执行(sleep 6; exit 222),后台执行echo 2wait $!等待echo 2,echo $?输出echo 2的返回值。
		不等待(sleep 6; exit 222),所以2s后结束。

等待多个后台命令完成

(sleep 3;echo 13; exit 113)& p3=$!;(sleep 1;echo 11; exit 111)& p1=$!;wait $p3 $p1;echo $?
或者(sleep 3;echo 13; exit 113)& p3=$!;(sleep 1;echo 11; exit 111)& p1=$!;wait $p3;wait $p1;echo $?
	休息1s,输出11,休息2s,输出13,输出111
	分析:
		后台执行(sleep 3;echo 13; exit 113),赋值该命令pid给p3,
		后台执行(sleep 1;echo 11; exit 111),赋值该命令pid给p1,
		等待p3的命令完成,再等待p1的命令完成(早已经完成),输出p1的命令的返回值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,共享内存和信号量都是用来实现进程间通信和同步的机制。 共享内存是指多个进程可以访问同一块物理内存,这就允许多个进程可以共享数据,从而实现数据的共享和同步。共享内存的使用需要注意进程间的互斥和同步问题,否则会出现数据竞争等问题。 信号量是一种计数器,用于同步不同进程之间的访问。每个进程需要在访问共享资源之前获取信号量,如果信号量的计数器为0,则进程会被阻塞,直到其他进程释放了资源并增加了信号量计数器的值。当进程完成对资源的访问后,它需要释放信号量,这样其他进程才能获取资源并继续执行。 下面是一个简单的使用共享内存和信号量实现进程同步的示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <string.h> #define SHM_SIZE 1024 #define SEM_KEY 1234 union semun { int val; struct semid_ds *buf; unsigned short *array; }; int main(int argc, char *argv[]) { int shmid, semid; char *shmaddr; union semun semarg; struct sembuf sembuf = {0, -1, SEM_UNDO}; //wait操作 struct sembuf sembuf2 = {0, 1, SEM_UNDO}; //signal操作 //创建共享内存 if ((shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666)) == -1) { perror("shmget"); exit(EXIT_FAILURE); } //附加共享内存到进程地址空间 if ((shmaddr = shmat(shmid, NULL, 0)) == (void *) -1) { perror("shmat"); exit(EXIT_FAILURE); } //创建信号量 if ((semid = semget(SEM_KEY, 1, IPC_CREAT | 0666)) == -1) { perror("semget"); exit(EXIT_FAILURE); } //设置信号量初始计数为1 semarg.val = 1; if (semctl(semid, 0, SETVAL, semarg) == -1) { perror("semctl"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } else if (pid == 0) { //子进程写入共享内存 strncpy(shmaddr, "hello", SHM_SIZE); //等待信号量 semop(semid, &sembuf, 1); printf("child process read from shared memory: %s\n", shmaddr); //释放信号量 semop(semid, &sembuf2, 1); //解除共享内存的附加 if (shmdt(shmaddr) == -1) { perror("shmdt"); exit(EXIT_FAILURE); } //删除共享内存 if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl"); exit(EXIT_FAILURE); } //删除信号量 if (semctl(semid, 0, IPC_RMID, semarg) == -1) { perror("semctl"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } else { //父进程读取共享内存 sleep(2); //等待信号量 semop(semid, &sembuf, 1); printf("parent process read from shared memory: %s\n", shmaddr); //释放信号量 semop(semid, &sembuf2, 1); //解除共享内存的附加 if (shmdt(shmaddr) == -1) { perror("shmdt"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } return 0; } ``` 在上述代码中,我们首先创建了一个大小为1024字节的共享内存和一个计数器初始值为1的信号量。子进程向共享内存写入数据,等待父进程读取数据完成后才能释放信号量;父进程则等待子进程写入数据,获取到信号量后读取数据并释放信号量。最后,我们删除共享内存和信号量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值