1.execl("./a.out", "./a.out", "123", "abc", NULL)为什么要写两个 ./a.out?
因为 main 函数要三个参数
第一个指针指向程序本身 第二个参数才是真正的参数 最后一个指向一个空指针
第一个 第三个必须有;
execl一旦执行成功 后面的都不执行,若是失败才执行后面的
2.execl与execv
execl("./son","./son",NULL);
char *arg[] = {"./son",NULL};
execv("./son",arg);(简洁)
经常忘记的 用输入参数个数控制数组个数
int main(int argc, char const *argv[])
{
for (int i=0 ; i<argc ; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
execl("./son","./son","ab", NULL); //传参
char *arg[] = {"./son","ab","cd",NULL};
execv("./son",arg);
打印命令
execlp("ls","ls","-al", NULL);
execl("/bin/ls","ls","-al", NULL);
函数名带字母 l 意味着其参数以列表(list)的方式提供。
函数名带字母 v 意味着其参数以矢量(vector)数组的方式提供。
函数名带字母 p 意味着会利用环境变量 PATH 来找寻指定的执行文件。
函数名带字母 e 意味着用户提供自定义的环境变量。
3.wait函数 等待子进程 死掉
WIFEXITED(status)如果子进程正常退出,则该宏为真。
WEXITSTATUS(status) 如果子进程正常退出,则该宏将获取子进程的退出值。 WIFSIGNALED(status) 如果子进程被信号杀死,则该宏为真。
WTERMSIG(status) 如果子进程被信号杀死,则该宏将获取导致他死亡的信号值。 WCOREDUMP(status)如果子进程被信号杀死且生成核心转储文件(core dump), 则该宏为真。
WIFSTOPPED(status) 如果子进程的被信号暂停,且 option 中 WUNTRACED 已经被 设置时,则该宏为真。
WSTOPSIG(status) 如果 WIFSTOPPED(status)为真,则该宏将获取导致子进程暂停的信号值。 WIFCONTINUED(status) 如果子进程被信号 SIGCONT 重新置为就绪态,该宏为真。
4.waitpid函数 等待子进程 死掉
唯一提供非阻塞等待 打印出来的数值无意义;
5.Pipe
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid > 0)
{
// printf("par:[%d],%d\n", getppid(), getpid());
char buf[24];
read(fd[0],buf,sizeof buf);
printf("子进程给的:%s\n",buf);
}
else
{
char* str="hello";
write(fd[1],str,sizeof str);
}
5.fifo
多个管道
6.悬而未决
pri 中没加时 会打印两次 加之后 只打一次
int main()
{
printf("[%d]fork之前",getpid());
pid_t pid = fork();
// 以上函数执行成功后
// 父子进程都将从下面的语句开始执行,不分先后
// 以下语句会被执行两遍
// 在父进程中,pid将是子进程的PID
// 在子进程中,pid将是0
printf("[%d]: pid=%d\n", getpid(), pid);
}
附录
套接字(也是管道) 主机和主机之间通信
access(FIFO_NAME,F_OK)为真表示不存在(检查文件是否存在 以及是否可读可写)