Linux系统编程练习、作业
8.13练习
练习1:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
void fun()
{printf("hahaha\n");
}
int main(int argc, char const *argv[])
{pid_t pid;pid = fork();char buf[6];if (pid == 0){usleep(1);memset(buf, 0, sizeof(buf));printf("efg\n");scanf("%s", buf);exit(*buf);}printf("abc\n");int status;pid_t wpid;wpid = wait(&status);switch (WEXITSTATUS(status)){case 'a':printf("hello\n");break;case 'b':printf("world\n");break;default:break;}atexit(fun);return 0;
}
练习2
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char const *argv[])
{int fd;pid_t pid1;int i = 0;char buf[8];fd = open("a.txt", O_RDWR | O_CREAT, 0664);pid1 = fork();if (pid1 == 0){while (i < 25){write(fd, "嘻嘻\n", 8);printf("写入第%d个\n", i);sleep(1);i++;}exit(0);}pid_t pid2;pid2 = fork();ssize_t rd;if (pid2 == 0){while (i < 25){memset(buf, 0, sizeof(buf));rd = read(fd, buf, sizeof(buf));printf("读取到:%s", buf);sleep(1);i++;}exit(0);}wait(NULL);wait(NULL);return 0;
}
8.13作业
作业1:
stdio.c,打开log.txt文件描述符,使用dup2(新,旧)使用fgets(line,sizeof(line),stdin)从标准输入逐行读取到line中用printf写入到重定向标准输出指向的log.txt文件中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>#define LOG "log.txt"
int main(int argc, char const *argv[])
{int log_fd = open(LOG, O_RDWR | O_CREAT | O_APPEND, 0664);dup2(log_fd, STDOUT_FILENO);char line[256];while (1){fgets(line, sizeof(line), stdin);printf("键盘输入的文本内容是:%s\n", line);fflush(stdout);}return 0;
}
execl_stdio.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{pid_t vpid;vpid=vfork();if(vpid==0){execl("./std","std",NULL);exit(0);}wait(NULL);return 0;
}
作业2:
out_std.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{char buf[256];while (1){fgets(buf, sizeof(buf), stdin);printf("被执行文件的键盘输入为:%s\n", buf);fflush(stdout);}return 0;
}
out_execl.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#define OUT_LOG "out_log.txt"int main(int argc, char const *argv[])
{int out_fd = open(OUT_LOG, O_RDWR | O_CREAT | O_APPEND, 0664);pid_t pid;pid = fork();if (pid == 0){dup2(out_fd, STDOUT_FILENO);close(out_fd); execl("./out_std", "out_std", NULL);}close(out_fd); wait(NULL);return 0;
}