ostep: add hw5
This commit is contained in:
parent
72f3484804
commit
22f71e1c99
|
@ -1,4 +1,10 @@
|
||||||
TARGETS := hw5_1
|
TARGETS := hw5_1 \
|
||||||
|
hw5_2 \
|
||||||
|
hw5_3 \
|
||||||
|
hw5_5 \
|
||||||
|
hw5_6 \
|
||||||
|
hw5_7 \
|
||||||
|
hw5_8
|
||||||
|
|
||||||
all: $(TARGETS)
|
all: $(TARGETS)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
const char default_path[] = "hello.txt";
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char buf[2] = {0x41, 0x0a};
|
||||||
|
char *pathname = (char *)default_path;
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
pathname = argv[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(pathname, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
|
||||||
|
if (fd == -1) {
|
||||||
|
perror("open");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (pid > 0) {
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
write(fd, buf, 2);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buf[0] = 0x42;
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
write(fd, buf, 2);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
int pipefd[2];
|
||||||
|
|
||||||
|
if (pipe(pipefd) == -1) {
|
||||||
|
perror("pipe");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (pid > 0) {
|
||||||
|
close(pipefd[1]);
|
||||||
|
|
||||||
|
char buf[1];
|
||||||
|
read(pipefd[0], buf, 1);
|
||||||
|
printf("goodbye\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sleep(1);
|
||||||
|
close(pipefd[0]);
|
||||||
|
|
||||||
|
printf("hello\n");
|
||||||
|
close(pipefd[1]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
else if (pid > 0) {
|
||||||
|
wait(&status);
|
||||||
|
if (!WIFEXITED(status)) {
|
||||||
|
fprintf(stderr, "child exited due to an error\n");
|
||||||
|
}
|
||||||
|
printf("goodbye: %d\n", status);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wait(&status);
|
||||||
|
if (!WIFEXITED(status)) {
|
||||||
|
fprintf(stderr, "child exited due to an error\n");
|
||||||
|
}
|
||||||
|
printf("hello: %d\n", status);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
else if (pid > 0) {
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
if (!WIFEXITED(status)) {
|
||||||
|
fprintf(stderr, "child exited due to an error\n");
|
||||||
|
}
|
||||||
|
printf("goodbye: %d\n", status);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("hello: %d\n", status);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
// child
|
||||||
|
else if (pid > 0) {
|
||||||
|
close(STDOUT_FILENO);
|
||||||
|
printf("screaming into the void...\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wait(NULL);
|
||||||
|
printf("the darkness\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int pipefd[2];
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
if (pipe(pipefd) != 0) {
|
||||||
|
perror("pipe");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
int pwrite = pipefd[1];
|
||||||
|
int pread = pipefd[0];
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
/* the first child */
|
||||||
|
else if (pid == 0) {
|
||||||
|
/*
|
||||||
|
* Close standard output and reassign it to the pipe.
|
||||||
|
* The close is done automagically by dup2.
|
||||||
|
*/
|
||||||
|
dup2(pwrite, STDOUT_FILENO);
|
||||||
|
|
||||||
|
/* Close unnecessary pipe read file descriptor. */
|
||||||
|
close(pread);
|
||||||
|
|
||||||
|
/* Now we do the thing. */
|
||||||
|
printf("Hello, world.\n");
|
||||||
|
|
||||||
|
/* ¡Adios! */
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are now in the parent. We must fork again, and do the
|
||||||
|
* child dance.
|
||||||
|
*/
|
||||||
|
if ((pid = fork()) < 0) {
|
||||||
|
perror("fork");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
/* the second of the children */
|
||||||
|
else if (pid == 0) {
|
||||||
|
/* Close standard input and reassign it to the pipe. */
|
||||||
|
dup2(pread, STDIN_FILENO);
|
||||||
|
|
||||||
|
/* Close unnecessary pipe write file descriptor. */
|
||||||
|
close(pwrite);
|
||||||
|
|
||||||
|
/* Read the thing. */
|
||||||
|
char data[16];
|
||||||
|
ssize_t rl;
|
||||||
|
|
||||||
|
memset(data, 0, 16);
|
||||||
|
rl = read(STDIN_FILENO, data, 15);
|
||||||
|
if (rl < 1) {
|
||||||
|
perror("read");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s", data);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wait for the children to die so we can reap them */
|
||||||
|
/* there are two, they should drop dead on their own. */
|
||||||
|
int status1, status2;
|
||||||
|
waitpid(-1, &status1, 0);
|
||||||
|
waitpid(-1, &status2, 0);
|
||||||
|
|
||||||
|
if (WIFEXITED(status1) && WIFEXITED(status2)) {
|
||||||
|
printf("Goodbye.\n");
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "At least one child died abnormally.\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
Loading…
Reference in New Issue