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)
|
||||
|
||||
|
|
|
@ -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